为什么元组在“[Serializable]”时没有无参数构造函数?

时间:2016-06-30 14:57:32

标签: c# serialization tuples

标有System.Tuple(T1,..)

[SerializableAttribute]个类(请参阅msdn)。但他们没有无参数构造函数,因此XmlSerializer不能序列化,因为它在here之前已被清除。那么为什么不加一个呢?

1 个答案:

答案 0 :(得分:4)

您不需要使用[Serializable]属性的类型来使用XmlSerializer序列化它,并且类型具有该属性的事实并不意味着您可以序列化它与XmlSerializer;这两者是无关的。 [Serializable]仅用于二进制序列化(*)(它不需要无参数构造函数)。

总结一下:

  • 二进制序列化
    • 需要[Serializable]属性
    • 不需要公共无参数构造函数
  • XML序列化
    • 不需要[Serializable]属性
    • 需要public无参数构造函数

因此,您无法使用Tuple<...>序列化XmlSerializer

无论上述情况如何,Tuple<...>都可以有一个默认的构造函数,但它没有多大意义:元组是不可变的(你不能设置它们的属性),所以如果你创建了一个使用默认构造函数的实例,属性将始终具有其默认值,并且无法更改。 (另外,属性是只读的这一事实也可以阻止使用XmlSerializer序列化元组,这只支持公共读写属性)

(*)实际上,不只是二进制序列化,而是任何序列化格式化程序(例如BinaryFormatterSoapFormatter ...)