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

WCF 默认使用 DataContractSerializer 进行序列化,无需额外配置即可工作。但若需精细控制(如兼容性、命名、忽略字段、集合处理等),需在数据契约或服务配置中显式设置。
1. 在数据契约类上标注 DataContract 和 DataMember
这是最基础也最关键的配置方式。只有显式标记的类型和成员才会被序列化:
-
red">必须为类添加
[DataContract]特性,否则即使有 public 属性也不会被序列化 -
每个要序列化的属性/字段必须加
[DataMember];未标记的会被跳过 - 支持设置
Name(自定义 XML 元素名)、Order(序列化顺序)、IsRequired(是否必填)、EmitDefaultValue(是否输出默认值)
示例:
[DataContract(Namespace = "http://mycompany.com/2024")]
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;不加即维持 DataContractSerializer
3. 配置绑定以启用/调整序列化行为
多数序列化控制在代码层完成,但绑定配置也影响底层 XML 处理:
-
basicHttpBinding和wsHttpBinding默认使用 DataContractSerializer - 若需更宽松的 XML 解析(如容忍命名空间差异),可在绑定中设置
readerQuotas或启用allowCookies等,但不改变序列化器本身 - 真正影响序列化逻辑的是
OperationBehavior或DataContractSerializerOperationBehavior扩展点(高级场景)
4. 注意命名空间与版本兼容性
XML 序列化的互操作性高度依赖命名空间一致性:
- 所有
[DataContract]建议显式指定Namespace,避免默认空命名空间导致解析异常 - 新增可选字段时,设
EmitDefaultValue = false并确保客户端能忽略未知元素 - 修改
Name或Order可能破坏旧客户端,建议配合[KnownType]或版本化契约







