为什么XmlSerializer不需要标记类型[Serializable]?

时间:2008-12-25 01:59:25

标签: c# xml-serialization datacontractserializer

在C#中,如果我想使用XmlSerializer序列化实例,则不必使用[Serializable]属性标记对象的类型。但是,对于其他序列化方法,例如DataContractSerializer,需要将该类标记为[Serializable][DataContract]

是否有关于序列化要求的标准或模式?

3 个答案:

答案 0 :(得分:16)

这是因为XmlSerializer仅序列化公共字段/属性。其他形式的序列化可以序列化私人数据,这构成了潜在的安全风险,因此您必须使用属性“选择加入”。

答案 1 :(得分:8)

安全不是唯一的问题;简单地说,序列化只对某些类有意义。例如,它使串行化“连接”变得很小。一个连接字符串,当然,连接本身?罗。同样,任何需要非托管指针/句柄的东西都不会很好地序列化。代表也不是。

此外,XmlSerializerDataContractSerializer(默认情况下)是序列化程序,而不是图形序列化程序 - 所以任何递归链接(如{{ 1}})会导致它破裂。

使用序列化程序的首选标记标记该类只是一种说法“它应该有意义”。

IIRC,Parent[XmlSerializer 使用 非常严格要求[DataContractSerializer],{{1}等要求}或[Serializable],但他们最近变得更自由了。

答案 2 :(得分:3)

目前,.Net Framework中有三种形式的序列化。

  1. XmlSerialization - 默认情况下适用于公共字段和属性。仍然可以通过XmlElementAttribute,XmlAttributeAttribute等控制......
  2. BinarySerialization - 由SerializationAttribute控制。深深融入CLR
  3. WCF Seralization - DataContractAttribute等......
  4. 遗憾的是,序列化的标准整体模式。所有3个框架都有不同的要求和怪癖。