可序列化类型

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

可以通过将DataContractAttributeDataMemberAttribute属性应用于类型和成员来更改默认行为。此功能在处理您无法控制且无法修改以添加属性的类型时非常有用。 DataContractSerializer 可识别这类“未标记”的类型。

序列化默认值

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

  • DataContractSerializer 从没有属性的类型推断数据契约,使用新创建类型的默认属性。

  • 所有公共字段以及具有公共 get 方法和 set 方法的属性都会序列化,除非将 IgnoreDataMemberAttribute 属性应用于该成员。

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

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

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

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

  • 如果不将 DataContractAttribute 特性应用于给定类型,序列化程序将忽略该属性应用到的该类型 DataMemberAttribute 中的任何成员。

  • 未用 KnownTypes 属性标记的类型中支持该 DataContractAttribute 属性。 这包括对 KnownTypeAttribute 未标记类型的属性的支持。

  • 若要为公共成员、属性或字段“选择退出”序列化过程,请将 IgnoreDataMemberAttribute 该属性应用于该成员。

继承

未标记的类型(没有 DataContractAttribute 属性的类型)可以继承自具有此属性的类型;然而,反过来则不允许:具有该属性的类型不能继承自未标记的类型。 此规则主要用于确保与早期版本的 .NET Framework 中编写的代码向后兼容。

另请参阅