在 C# 中,如果我想用 序列化一个实例XmlSerializer
,则对象的类型不必用[Serializable]
属性标记。但是,对于其他序列化方法,例如DataContractSerializer
,需要将类标记为[Serializable]
或[DataContract]
。
有没有关于序列化要求的标准或模式?
在 C# 中,如果我想用 序列化一个实例XmlSerializer
,则对象的类型不必用[Serializable]
属性标记。但是,对于其他序列化方法,例如DataContractSerializer
,需要将类标记为[Serializable]
或[DataContract]
。
有没有关于序列化要求的标准或模式?
这是因为 XmlSerializer 只序列化公共字段/属性。其他形式的序列化可以序列化私有数据,这构成潜在的安全风险,因此您必须使用属性“选择加入”。
安全不是唯一的问题。简单地说,序列化只对某些类有意义。例如,序列化“连接”几乎没有什么意义。一个连接字符串,当然,但是连接本身呢?不。同样,任何需要非托管指针/句柄的东西都不会很好地序列化。代表也不是。
此外,XmlSerializer
and DataContractSerializer
(默认情况下)是树序列化器,而不是图形序列化器 - 因此任何递归链接(如Parent
)都会导致它中断。
用序列化程序的首选标记标记类只是一种说“它应该有意义”的方式。
IIRC,两者都[XmlSerializer
曾经[DataContractSerializer]
非常严格地要求诸如[Serializable]
,[DataContract]
或之类的东西[IXmlSerializable]
,但最近它们变得更加自由了。
现在 .Net 框架中确实有 3 种形式的序列化。
不幸的是,序列化有标准的整体模式。所有 3 个框架都有不同的要求和怪癖。