C# 使用c进行序列化#
为什么不在c#中对XMLSerializer使用serialization属性呢C# 使用c进行序列化#,c#,serialization,xmlserializer,C#,Serialization,Xmlserializer,为什么不在c#中对XMLSerializer使用serialization属性呢 此处OrderedItem类未序列化。原因是什么?BinaryFormatter使用[Serializable]属性。 然而,XMLSerializer不需要这个。通过创建seralizer XmlSerializer serializer = new XmlSerializer(typeof(OrderedItem)); 他假设OrderedItem确实是可序列化的。OrderedItem非常序
此处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]属性标记它们吗?确实,必须有某种级别的可选配置