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

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

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

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

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

此外, XmlSerializerDataContractSerializer (默认情况下)是序列化器,而不是图形序列化器 – 因此任何递归链接(如Parent )都会导致它断开。

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

IIRC, [XmlSerializer[DataContractSerializer]对于像[Serializable][DataContract][IXmlSerializable]这样的要求非常严格,但最近它们变得更加开放了。

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

  1. XmlSerialization – 默认情况下适用于公共字段和属性。 仍然可以通过XmlElementAttribute,XmlAttributeAttribute等控制…
  2. BinarySerialization – 由SerializationAttribute控制。 深入集成到CLR中
  3. WCF Seralization – DataContractAttribute等…

不幸的是,序列化的标准整体模式。 所有3个框架都有不同的要求和怪癖。