DataContractSerializer 是 WCF 默认序列化器,需用 [DataContract] 和 [DataMember] 显式标记类与成员,未标记者不序列化;支持 XML 读写、引用保留、已知类型及版本兼容配置,WCF 各绑定默认使用,不支持 [Serializable]。

DataContractSerializer 是 WCF 默认使用的序列化器,专为服务间数据交换设计,比 XmlSerializer 更轻量、更可控,也更适合跨平台(如与 Java WebService 互操作)。它不依赖公共属性的可访问性,而是靠显式标记来决定哪些成员参与序列化。
怎么标记类和成员
必须用 [DataContract] 标记类,用 [DataMember] 标记要序列化的字段或属性。未标记的成员默认不序列化,即使 public 也不行。
示例:
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember(Name = "EmailAddr")] // 序列化时用 EmailAddr 作为 XML 元素名
public string Email { get; set; }
public string InternalNote { get; set; } // 不会序列化
}
创建并使用 DataContractSerializer
构造时传入类型即可,支持泛型重载。调用 WriteObject 写入流,ReadObject 从流读取反序列化。
- 写入 XML 文件:
var person = new Person { Name = "Alice", Age = 30, Email = "a@b.com" };
var serializer = new DataContractSerializer(typeof(Person));
using (var fs = File.Create("person.xml"))
{
serializer.WriteObject(fs, person);
}
- 读取并还原对象:
using (var fs = File.OpenRead("person.xml"))
{
var restored = (Person)serializer.ReadObject(fs);
}
常用配置选项
构造函数支持传入 DataContractSerializerSettings 或直接用 bool 参数控制行为:
-
ignoreExtensionDataObject: true:忽略扩展数据(用于版本兼容) -
preserveObjectReferences: true:保留对象引用(避免循环引用报错,生成带id/ref的 XML) - 指定已知类型:
new DataContractSerializer(typeof(MyType), knownTypes),处理继承或接口场景
和 WCF 的关系
WCF 的 BasicHttpBinding、NetTcpBinding 等默认都用 DataContractSerializer。你在服务契约中定义的 [DataContract] 类型,会被自动识别并序列化传输。
注意:WCF 不支持 [Serializable] 标记的类(除非显式配置为用 NetDataContractSerializer,但不推荐,有安全风险)。
基本上就这些。用好 DataContractSerializer,关键就是标记清楚 + 类型明确 + 配置按需开启。







