18

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

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

4

3 回答 3

20

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

于 2008-12-25T02:03:10.053 回答
8

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

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

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

IIRC,两者都[XmlSerializer曾经[DataContractSerializer] 非常严格地要求诸如[Serializable],[DataContract]或之类的东西[IXmlSerializable],但最近它们变得更加自由了。

于 2008-12-26T08:34:22.260 回答
4

现在 .Net 框架中确实有 3 种形式的序列化。

  1. XmlSerialization - 默认情况下适用于公共字段和属性。仍然可以通过 XmlElementAttribute、XmlAttributeAttribute 等进行控制...
  2. BinarySerialization - 由 SerializationAttribute 控制。深度集成到 CLR
  3. WCF 序列化 - DataContractAttribute 等...

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

于 2008-12-25T15:21:22.440 回答