2016-06-30 94 views
4

System.Tuple(T1,..)类别标记为[SerializableAttribute](见msdn)。但是它们没有无参数的构造函数,因此它不能被XmlSerializer序列化,因为它在here之前已被清除。那么为什么不添加一个?为什么元组没有无参数构造函数,而`[Serializable]`?

+3

我不明白为什么这是被低估。任何知道序列化应该如何工作的人都是一个相当有趣的问题。 –

+4

谁投票结束,因为它“主要是基于意见”显然不明白这个问题。 –

+0

@ThomasLevesque问题是让人猜测为什么这个框架类的设计方式是这样的。这完全是基于意见的。考虑到你发布了一个答案,甚至没有试图回答被问到的问题,即为什么这个类没有无参数的构造函数,似乎你是不了解问题的那个。 – Servy

回答

3

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

概括起来:

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

因此,使用XmlSerializer你不能序列化Tuple<...>


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


(*)其实,不只是二进制序列化,但任何序列化格式(如BinaryFormatter,SoapFormatter ...)

+1

围绕这个问题的这种裙子。我相信问题的精神在于 - 为什么Tuple没有公共无参数构造函数,因此它可以与XmlSerializer一起使用? – bodangly

+0

@bodangly OP似乎认为因为Tuple是'[Serializable]',它应该有一个无参数的构造函数,并且可以用'XmlSerializable'来序列化,这是不正确的 –

+0

@bogdanly我更新了我的答案 –

相关问题