C# 使用c进行序列化#

C# 使用c进行序列化#,c#,serialization,xmlserializer,C#,Serialization,Xmlserializer,为什么不在c#中对XMLSerializer使用serialization属性呢 此处OrderedItem类未序列化。原因是什么?BinaryFormatter使用[Serializable]属性。 然而,XMLSerializer不需要这个。通过创建seralizer XmlSerializer serializer = new XmlSerializer(typeof(OrderedItem)); 他假设OrderedItem确实是可序列化的。OrderedItem非常序

为什么不在c#中对XMLSerializer使用serialization属性呢


此处OrderedItem类未序列化。原因是什么?

BinaryFormatter使用[Serializable]属性。 然而,XMLSerializer不需要这个。通过创建seralizer

   XmlSerializer serializer = 
   new XmlSerializer(typeof(OrderedItem));

他假设OrderedItem确实是可序列化的。

OrderedItem
非常序列化。。。我猜您的意思是“为什么它没有
[Serializable]
属性?”。如果是这样,答案很简单:序列化程序不需要它。BinaryFormatter等需要它,但他们做的事情有点不同——他们正在序列化对象的内部状态。然而,现在大多数序列化程序都不检查这一点;示例:

  • XmlSerializer
  • DataContractSerializer
    (以及所有变体)
  • JavascriptSerializer
  • JSON.net
  • protobuf网
  • 还有很多其他的
基本上,这是没有必要的。可能关键的区别在于,
BinaryFormatter
可能会意外地(没有该属性)通过远程处理边界发送不适当的数据,这可能会导致大问题


许多“轻型”框架甚至没有定义
[Serializable]

我发现的一个解释是,如果您将类标记为
[Serializable]
,并使用
二进制格式化程序对该对象进行序列化,例如,即使该类实例的私有成员也将被序列化,因此,这是一种机制,通过它,您可以决定该类是应该整体序列化,还是使用Xml或JS序列化程序序列化,并仅获取公共成员


因此,如果您使用XmlSerializer进行序列化,则只会序列化公共成员。

您会问,为什么在该示例中,类OrderedItem没有标记为[Serializable]的属性?是的,对于BinaryFormatter和SoapFormatter,我们使用[Serializable]。这就是我们放置typeof(OrderedItem)的原因吗?@chathura2020否,这是因为
XmlSerializer
是一个基于契约的序列化程序,如果没有它,它将不知道需要什么数据,特别是对于反序列化。如果你不告诉它类型,然后说“反序列化
…它使用什么类型?你不能只说
Foo
,因为a:可以有多个
Foo
,b:
[XmlRoot]
可以用来使
成为名为
Bar
的类的xml。“公共成员”“事情并不可靠,
XmlSerializer
就是这种情况,但是还有其他序列化程序将序列化非公共成员,并且不需要
[Serializable]
DataContractSerializer
例如。@MarcGravel当然可以,但为了让DataContractSerializer获得每个成员,您不需要手动用[DataMember]属性标记它们吗?确实,必须有某种级别的可选配置