WCF服务中的XML序列化怎么配置 DataContractSerializer

WCF默认使用DataContractSerializer,需通过[DataContract]/[DataMember]显式标记类型和成员以控制序列化行为,支持Name、Order、IsRequired、EmitDefaultValue等属性;可选替换为XmlSerializer或通过ServiceKnownType、CollectionDataContract等增强兼容性与集合处理。

WCF 默认使用 DataContractSerializer 进行序列化,无需额外配置即可工作。但若需精细控制(如兼容性、命名、忽略字段、集合处理等),需在数据契约或服务配置中显式设置。

1. 在数据契约类上标注 DataContract 和 DataMember

这是最基础也最关键的配置方式。只有显式标记的类型和成员才会被序列化:

  • 必须为类添加 [DataContract] 特性,否则即使有 public 属性也不会被序列化
  • 每个要序列化的属性/字段必须加 [DataMember];未标记的会被跳过
  • 支持设置 Name(自定义 XML 元素名)、Order(序列化顺序)、IsRequired(是否必填)、EmitDefaultValue(是否输出默认值)

示例:

[DataContract(Namespace = "http://mycompany.com/2025")]
public class Person
{
    [DataMember(Name = "FullName", Order = 1, IsRequired = true)]
    public string Name { get; set; }

    [DataMember(Order = 2, EmitDefaultValue = false)]
    public int? Age { get; set; } // null 不会出现在 XML 中

    [DataMember(Name = "EmailAddr")]
    public string Email { get; set; }
}

2. 替换默认序列化器(按需)

WCF 绑定默认用 DataContractSerializer,但某些场景(如需兼容老 ASMX 服务)可能需改用 XmlSerializer。若坚持用 DataContractSerializer,通常无需替换——但可自定义其行为:

  • 在服务操作上用 [ServiceKnownType] 声明派生类型,避免反序列化失败
  • 通过 [CollectionDataContract] 控制集合类的根元素名和项元素名
  • OperationContract 上设置 XmlSerializerFormat 会强制切换为 XmlSerializer;不加即维持 DataContractSeri

    alizer

3. 配置绑定以启用/调整序列化行为

多数序列化控制在代码层完成,但绑定配置也影响底层 XML 处理:

  • basicHttpBindingwsHttpBinding 默认使用 DataContractSerializer
  • 若需更宽松的 XML 解析(如容忍命名空间差异),可在绑定中设置 readerQuotas 或启用 allowCookies 等,但不改变序列化器本身
  • 真正影响序列化逻辑的是 OperationBehaviorDataContractSerializerOperationBehavior 扩展点(高级场景)

4. 注意命名空间与版本兼容性

XML 序列化的互操作性高度依赖命名空间一致性:

  • 所有 [DataContract] 建议显式指定 Namespace,避免默认空命名空间导致解析异常
  • 新增可选字段时,设 EmitDefaultValue = false 并确保客户端能忽略未知元素
  • 修改 NameOrder 可能破坏旧客户端,建议配合 [KnownType] 或版本化契约