为什么XmlSerializer不需要标记类型?
在C#中,如果我想使用XmlSerializer
序列化实例,则不必使用[Serializable]
属性标记对象的类型。 但是,对于其他序列化方法,例如DataContractSerializer
,需要将类标记为[Serializable]
或[DataContract]
。
是否有关于序列化要求的标准或模式?
这是因为XmlSerializer仅序列化公共字段/属性。 其他forms的序列化可以序列化私有数据,这构成了潜在的安全风险,因此您必须使用属性“选择加入”。
安全不是唯一的问题; 简单地说,序列化只对某些类有意义。 例如,它使串行化“连接”变得很小。 一个连接字符串 ,当然,但连接本身? 罗。 同样,任何需要非托管指针/句柄的东西都不会很好地序列化。 代表也不是。
此外, XmlSerializer
和DataContractSerializer
(默认情况下)是树序列化器,而不是图形序列化器 – 因此任何递归链接(如Parent
)都会导致它断开。
使用序列化程序的首选标记来标记类只是一种说法“它应该有意义”。
IIRC, [XmlSerializer
和[DataContractSerializer]
对于像[Serializable]
, [DataContract]
或[IXmlSerializable]
这样的要求非常严格,但最近它们变得更加开放了。
目前,.Net Framework中有三种forms的序列化。
- XmlSerialization – 默认情况下适用于公共字段和属性。 仍然可以通过XmlElementAttribute,XmlAttributeAttribute等控制…
- BinarySerialization – 由SerializationAttribute控制。 深入集成到CLR中
- WCF Seralization – DataContractAttribute等…
不幸的是,序列化的标准整体模式。 所有3个框架都有不同的要求和怪癖。