可序列化类型
默认情况下,DataContractSerializer 序列化所有公共可见类型。类型的所有公共读/写属性和字段都会进行序列化。
可以通过对类型和成员应用 DataContractAttribute 和 DataMemberAttribute 属性来更改默认行为。当您拥有不受您控制因而无法对其进行修改以添加属性的类型时,此功能可能会十分有用。DataContractSerializer 可识别这类“未标记”的类型。
序列化默认设置
可以应用 DataContractAttribute 和 DataMemberAttribute 属性以显式控制或自定义类型和成员的序列化。此外,还可以将这些属性应用于私有字段。但是,即使未用这些属性进行标记的类型也会进行序列化和反序列化。适用的规则和例外如下:
- DataContractSerializer 使用新创建的类型的默认属性 (Property) 从不带属性 (Attribute) 的类型推断数据协定。
- 除非对成员应用 IgnoreDataMemberAttribute 属性 (Attribute),否则所有公共字段以及具有公共
get
和set
方法的属性 (Property) 都会序列化。 - 序列化语义与 XmlSerializer 的语义类似。
- 在未标记的类型中,仅序列化具有不带参数的构造函数的公共类型。此规则的例外是用于 IExtensibleDataObject 接口的 ExtensionDataObject。
- 只读字段、没有
get
或set
方法的属性以及具有内部或私有set
或get
方法的属性不会进行序列化。此类属性会被忽略,但不会引发异常(get-only 集合的情况除外)。 - 会忽略 XmlSerializer 属性(如 XmlElement、XmlAttribute、XmlIgnore、XmlInclude 等)。
- 如果未将 DataContractAttribute 属性应用于某个给定类型,则序列化程序会忽略该类型中应用了 DataMemberAttribute 属性的所有成员。
- 未使用 DataContractAttribute 属性 (Attribute) 进行标记的类型中支持 KnownTypes 属性 (Property)。这包括对未标记类型上的 KnownTypeAttribute 属性 (Attribute) 的支持。
- 若要使公共成员、属性 (Property) 或字段“退出”序列化过程,请向该成员应用 IgnoreDataMemberAttribute 属性 (Attribute)。
继承
未标记类型(没有 DataContractAttribute 属性的类型)可以从具有此属性的类型继承;但是反过来则不允许:具有该属性的类型不能从未标记类型继承。实行此规则主要是为了确保与使用旧版本 .NET Framework 编写的代码向后兼容。
另请参见
参考
IgnoreDataMemberAttribute
DataContractAttribute
DataMemberAttribute
XmlSerializer