C# 为什么元组不';“[Serializable]”时没有无参数构造函数吗?

C# 为什么元组不';“[Serializable]”时没有无参数构造函数吗?,c#,serialization,tuples,C#,Serialization,Tuples,System.Tuple(T1,…)用[SerializableAttribute]标记的类(请参阅)。但它们没有无参数构造函数,因此不能通过XmlSerializer进行序列化,因为它在之前被清除。那为什么不加一个呢 使用XmlSerializer对类型进行序列化不需要类型具有[Serializable]属性,并且类型具有该属性并不意味着可以使用XmlSerializer对其进行序列化;这两件事毫不相关[Serializable]仅用于二进制序列化(*)(不需要无参数构造函数) 总而言之:

System.Tuple(T1,…)
[SerializableAttribute]
标记的类(请参阅)。但它们没有无参数构造函数,因此不能通过
XmlSerializer
进行序列化,因为它在之前被清除。那为什么不加一个呢

使用
XmlSerializer
对类型进行序列化不需要类型具有
[Serializable]
属性,并且类型具有该属性并不意味着可以使用
XmlSerializer
对其进行序列化;这两件事毫不相关<代码>[Serializable]仅用于二进制序列化(*)(不需要无参数构造函数)

总而言之:

  • 二进制序列化
    • 需要
      [Serializable]
      属性
    • 不需要公共的无参数构造函数
  • XML序列化
    • 不需要
      [Serializable]
      属性
    • 需要
      public
      无参数构造函数
因此,不能使用
XmlSerializer
元组进行序列化


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



(*)实际上,不仅仅是二进制序列化,还有任何序列化格式化程序(例如,
BinaryFormatter
SoapFormatter
…)

我不明白为什么这会被否决。对于任何知道序列化应该如何工作的人来说,这是一个相当有趣的问题。因为序列化“主要基于观点”而投票关闭的人显然不理解这个问题。@ThomasLevesque问题是让人们猜测为什么这个框架类是这样设计的。这完全是基于意见的。鉴于您发布的答案根本没有试图回答所问的问题,即为什么这个类没有无参数构造函数,似乎您不理解这个问题。@Servy,有时您必须阅读问题的字里行间。我认为我的回答对OP更有用,而不仅仅是解释为什么没有公共构造函数(它确实解释了这一点,尽管这确实只是我对这一问题的看法)。@ThomasLevesque那么你会发现这个问题实际上是基于观点的,你只是希望OP实际上是一个不同于他们实际提出的问题,而不是基于意见的问题,并且仍然觉得基于意见的问题因为基于意见而被关闭是完全不合适的。这种回避问题的方式。我相信问题的实质很简单——为什么Tuple没有一个公共的无参数构造函数,这样它就可以与XmlSerializer一起使用?@bodangly OP似乎认为,因为Tuple是
[Serializable]
,所以它应该有一个无参数构造函数,并且可以与
XmlSerializable
一起序列化,这不是真的一个
[Serializable]
类不能被序列化,这就是我遇到的问题。这不是我所期望的。是的,
XmlSerializable
需要无参数构造函数。因此,最好将其命名为
[Formattable]