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