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