可序列化类型

默认情况下,DataContractSerializer 序列化所有公共可见类型。 类型的所有公共读/写属性和字段均被序列化。

可以通过对类型和成员应用 DataContractAttributeDataMemberAttribute 属性来更改默认行为。当您拥有不受您控制因而无法对其进行修改以添加属性的类型时,此功能可能会十分有用。 DataContractSerializer 可识别这类“未标记”的类型。

序列化默认设置

可以应用 DataContractAttributeDataMemberAttribute 属性以显式控制或自定义类型和成员的序列化。 此外,还可以将这些属性应用于私有字段。 但是,即使未用这些属性进行标记的类型也会进行序列化和反序列化。 适用的规则和例外如下:

  • DataContractSerializer 使用新创建的类型的默认属性从不带属性的类型推断数据协定。

  • 除非对成员应用 get 属性 (Attribute),否则所有公共字段以及具有公共 setIgnoreDataMemberAttribute 方法的属性 (Property) 都会序列化。

  • 序列化语义与 XmlSerializer 的语义类似。

  • 在未标记的类型中,仅序列化具有不带参数的构造函数的公共类型。 此规则的例外是用于 ExtensionDataObject 接口的 IExtensibleDataObject

  • 只读字段、没有 getset 方法的属性以及具有内部或私有 setget 方法的属性不会进行序列化。 此类属性会被忽略,但不会引发异常(get-only 集合的情况除外)。

  • 会忽略 XmlSerializer 属性(如 XmlElementXmlAttributeXmlIgnoreXmlInclude 等)。

  • 如果未将 DataContractAttribute 属性应用于某个给定类型,则序列化程序会忽略该类型中应用了 DataMemberAttribute 属性的所有成员。

  • 未使用 KnownTypes 属性 (Attribute) 进行标记的类型中支持 DataContractAttribute 属性 (Property)。 这包括对未标记类型上的 KnownTypeAttribute 属性 (Attribute) 的支持。

  • 若要使公共成员、属性 (Property) 或字段“退出”序列化过程,请向该成员应用 IgnoreDataMemberAttribute 属性 (Attribute)。

继承

未标记类型(没有 DataContractAttribute 属性的类型)可以从具有此属性的类型继承;但是反过来则不允许:具有该属性的类型不能从未标记类型继承。 实行此规则主要是为了确保与使用旧版本 .NET Framework 编写的代码的后向兼容性。

请参阅