在C#中,如果我想使用XmlSerializer
序列化实例,则不必使用[Serializable]
属性标记对象的类型。但是,对于其他序列化方法,例如DataContractSerializer
,需要将该类标记为[Serializable]
或[DataContract]
。
是否有关于序列化要求的标准或模式?
答案 0 :(得分:16)
这是因为XmlSerializer仅序列化公共字段/属性。其他形式的序列化可以序列化私人数据,这构成了潜在的安全风险,因此您必须使用属性“选择加入”。
答案 1 :(得分:8)
安全不是唯一的问题;简单地说,序列化只对某些类有意义。例如,它使串行化“连接”变得很小。一个连接字符串,当然,连接本身?罗。同样,任何需要非托管指针/句柄的东西都不会很好地序列化。代表也不是。
此外,XmlSerializer
和DataContractSerializer
(默认情况下)是树序列化程序,而不是图形序列化程序 - 所以任何递归链接(如{{ 1}})会导致它破裂。
使用序列化程序的首选标记标记该类只是一种说法“它应该有意义”。
IIRC,Parent
和[XmlSerializer
使用 非常严格要求[DataContractSerializer]
,{{1}等要求}或[Serializable]
,但他们最近变得更自由了。
答案 2 :(得分:3)
目前,.Net Framework中有三种形式的序列化。
遗憾的是,序列化的标准整体模式。所有3个框架都有不同的要求和怪癖。