使用 XmlSerializer 类:
Windows Communication Foundation (WCF) 可以使用两种不同的序列化技术将应用程序中的数据转换为在客户端和服务之间传输的 XML,这一过程称为序列化。
DataContractSerializer 作为默认值:
默认情况下,WCF 使用 DataContractSerializer 类来序列化数据类型。此序列化程序支持以下类型:
基元类型(例如,整数、字符串和字节数组),以及一些特殊类型,例如 XmlElement 和 DateTime,它们都被视为基元。
数据协定类型(用 DataContractAttribute 属性标记的类型)。
标有 SerializableAttribute 属性的类型,包括实现 ISerializable 接口的类型。
实现 IXmlSerializable 接口的类型。
许多常见的集合类型,其中包括许多通用集合类型。
许多 .NET Framework 类型属于后两类,因此是可序列化的。可序列化类型的数组也是可序列化的。有关完整列表,请参阅在服务合同中指定数据传输。
与数据协定类型一起使用的 DataContractSerializer 是编写新 WCF 服务的推荐方法。有关详细信息,请参阅使用数据协定。
何时使用 XmlSerializer 类:
WCF 还支持 XmlSerializer 类。 XmlSerializer 类不是 WCF 独有的。它与 ASP.NET Web 服务使用的序列化引擎相同。 XmlSerializer 类支持比 DataContractSerializer 类更窄的类型集,但允许对生成的 XML 进行更多控制,并支持更多的 XML 架构定义语言 (XSD) 标准。它也不需要可序列化类型的任何声明性属性。有关详细信息,请参阅 .NET Framework 文档中的 XML 序列化主题。 XmlSerializer 类不支持数据协定类型。
在使用 Svcutil.exe 或 Visual Studio 中的添加服务引用功能为第三方服务生成客户端代码或访问第三方架构时,会自动为您选择适当的序列化程序。如果架构与 DataContractSerializer 不兼容,则选择 XmlSerializer。
手动切换到 XmlSerializer:
有时,您可能必须手动切换到 XmlSerializer。例如,在以下情况下会发生这种情况:
将应用程序从 ASP.NET Web 服务迁移到 WCF 时,您可能希望重用现有的与 XmlSerializer 兼容的类型,而不是创建新的数据协定类型。
当精确控制出现在消息中的 XML 很重要,但 Web 服务描述语言 (WSDL) 文档不可用时,例如,当创建具有必须符合某个标准化、已发布架构的类型的服务时与 DataContractSerializer 不兼容。
创建遵循旧版 SOAP 编码标准的服务时。
在这些和其他情况下,您可以通过将 XmlSerializerFormatAttribute 属性应用于您的服务来手动切换到 XmlSerializer 类,如以下代码所示。
[ServiceContract]
[XmlSerializerFormat]
public class BankingService
{
[OperationContract]
public void ProcessTransaction(BankingTransaction bt)
{
// Code not shown.
}
}
//BankingTransaction is not a data contract class,
//but is an XmlSerializer-compatible class instead.
public class BankingTransaction
{
[XmlAttribute]
public string Operation;
[XmlElement]
public Account fromAccount;
[XmlElement]
public Account toAccount;
[XmlElement]
public int amount;
}
//Notice that the Account class must also be XmlSerializer-compatible.