System.Tuple(T1,..)
类别标记为[SerializableAttribute]
(见msdn)。但是它们没有无参数的构造函数,因此它不能被XmlSerializer
序列化,因为它在here之前已被清除。那么为什么不添加一个?为什么元组没有无参数构造函数,而`[Serializable]`?
回答
您不需要使用[Serializable]
属性将其序列化为XmlSerializer
,类型具有该属性的事实并不意味着您可以使用XmlSerializer
将其序列化;这两者是无关的。 [Serializable]
仅用于二进制序列化(*)(不需要无参数构造函数)。
概括起来:
- 二进制序列
- 需要
[Serializable]
属性 - 不需要公共参数构造函数
- 需要
- XML序列化
- 不需要
[Serializable]
属性 - 需要
public
参数的构造函数
- 不需要
因此,使用XmlSerializer
你不能序列化Tuple<...>
。
不管上述情况,Tuple<...>
可以有一个默认的构造函数,但它没有多大意义:元组是不可变的(你不能设置其属性),所以如果你用默认创建的实例构造函数,属性将始终具有其默认值,无法更改。 (而且,事实上,属性是只读的,也未尝防止元组被序列化与XmlSerializer
,只支持公共读写属性)
(*)其实,不只是二进制序列化,但任何序列化格式(如BinaryFormatter
,SoapFormatter
...)
围绕这个问题的这种裙子。我相信问题的精神在于 - 为什么Tuple没有公共无参数构造函数,因此它可以与XmlSerializer一起使用? – bodangly
@bodangly OP似乎认为因为Tuple是'[Serializable]',它应该有一个无参数的构造函数,并且可以用'XmlSerializable'来序列化,这是不正确的 –
@bogdanly我更新了我的答案 –
- 1. 为什么基类(不实现Serializable)如果其子类实现Serializable,应该没有参数构造函数?
- 2. 为什么System.Data.SqlClient.SqlDataReader没有构造函数
- 3. PhoneApplicationPage没有无参数构造函数
- 4. System.Data.Entity.Spatial.DbGeography - 没有无参数构造函数
- 5. 没有参数的构造函数或参数构造函数
- 6. 为什么StringBuffer允许StringBuffer作为其构造函数的参数,即使StringBuffer没有StringBuffer构造函数?
- 7. 无参数构造函数调用2参数构造函数
- 8. 没有为此对象定义的无参数构造函数。
- 9. 没有为此对象定义的无参数构造函数
- 10. 没有为此对象定义的无参数构造函数?
- 11. 无参数构造函数
- 12. 无参数构造函数
- 13. 为什么IllegalAccessError不具有双参数构造函数?
- 14. 为什么我无法从私有类中的参数化构造函数调用默认构造函数?
- 15. 元组不能被序列化,因为它没有参数的构造函数
- 16. 空的构造函数和没有构造函数有什么区别
- 17. 什么可能导致“JAXBElement没有无参数默认构造函数”?
- 18. 为什么对象的构造函数返回Object()而不是构造函数?
- 19. 为什么调用复制构造函数而不是移动构造函数?
- 20. 为什么这个构造函数调用另一个没有参数?
- 21. 为什么没有使用可变参数的List构造函数?
- 22. 为什么在容器的构造函数中没有容量参数?
- 23. 为什么构造函数不是构造函数?
- 24. 为什么没有为std :: string保留构造函数?
- 25. 为什么我不能强制派生类具有无参数构造函数?
- 26. 构造函数和无参数构造函数?
- 27. 有什么好的理由,为什么ArrayList不把数组作为构造函数参数?
- 28. 需要添加无参数构造函数。困惑什么也
- 29. 结构图没有为此对象定义的无参数构造函数
- 30. 为什么一个静态构造没有任何参数
我不明白为什么这是被低估。任何知道序列化应该如何工作的人都是一个相当有趣的问题。 –
谁投票结束,因为它“主要是基于意见”显然不明白这个问题。 –
@ThomasLevesque问题是让人猜测为什么这个框架类的设计方式是这样的。这完全是基于意见的。考虑到你发布了一个答案,甚至没有试图回答被问到的问题,即为什么这个类没有无参数的构造函数,似乎你是不了解问题的那个。 – Servy