可序列化类型

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

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

序列化默认设置

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

  • DataContractSerializer 使用新创建的类型的默认属性 (Property) 从不带属性 (Attribute) 的类型推断数据协定。
  • 除非对成员应用 IgnoreDataMemberAttribute 属性 (Attribute),否则所有公共字段以及具有公共 getset 方法的属性 (Property) 都会序列化。
  • 序列化语义与 XmlSerializer 的语义类似。
  • 在未标记的类型中,仅序列化具有不带参数的构造函数的公共类型。此规则的例外是用于 IExtensibleDataObject 接口的 ExtensionDataObject
  • 只读字段、没有 getset 方法的属性以及具有内部或私有 setget 方法的属性不会进行序列化。此类属性会被忽略,但不会引发异常(get-only 集合的情况除外)。
  • 会忽略 XmlSerializer 属性(如 XmlElementXmlAttributeXmlIgnoreXmlInclude 等)。
  • 如果未将 DataContractAttribute 属性应用于某个给定类型,则序列化程序会忽略该类型中应用了 DataMemberAttribute 属性的所有成员。
  • 未使用 DataContractAttribute 属性 (Attribute) 进行标记的类型中支持 KnownTypes 属性 (Property)。这包括对未标记类型上的 KnownTypeAttribute 属性 (Attribute) 的支持。
  • 若要使公共成员、属性 (Property) 或字段“退出”序列化过程,请向该成员应用 IgnoreDataMemberAttribute 属性 (Attribute)。

继承

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

另请参见

参考

IgnoreDataMemberAttribute
DataContractAttribute
DataMemberAttribute
XmlSerializer

概念

数据协定序列化程序支持的类型