Windows Communication Foundation (WCF) 包括新的序列化引擎 ,即 DataContractSerializer.
DataContractSerializer
用于在 .NET Framework 对象和 XML 之间进行双向转换。 除了序列化程序本身,WCF 还包括关联的架构导入和架构导出机制。
架构 是序列化程序生成或反序列化程序可以访问的 XML 形状的正式、精确且计算机可读的说明。 WCF 使用万维网联盟 (W3C) XML 架构定义语言 (XSD) 作为其架构表示形式,该语言与许多第三方平台广泛互作。
架构导入组件 XsdDataContractImporter采用 XSD 架构文档并生成 .NET Framework 类(通常为数据协定类),以便序列化表单对应于给定架构。
例如,以下架构片段:
XsdDataContractImporter importer = new XsdDataContractImporter();
importer.Options.Namespaces.Add(new KeyValuePair<string, string>("http://schemas.contoso.com/carSchema", "Contoso.Cars"));
Dim importer As New XsdDataContractImporter
importer.Options.Namespaces.Add(New KeyValuePair(Of String, String)("http://schemas.contoso.com/carSchema", "Contoso.Cars"))
生成以下类型(稍微简化一下以提高可读性)。
[DataContract]
public partial class Vehicle : IExtensibleDataObject
{
private int yearField;
private string colorField;
[DataMember]
public int year
{
get { return this.yearField; }
set { this.yearField = value; }
}
[DataMember]
public string color
{
get { return this.colorField; }
set { this.colorField = value; }
}
private ExtensionDataObject extensionDataField;
public ExtensionDataObject ExtensionData
{
get { return this.extensionDataField; }
set { this.extensionDataField = value; }
}
}
Partial Class Vehicle
Implements IExtensibleDataObject
Private yearField As Integer
Private colorField As String
<DataMember()> _
Public Property year() As Integer
Get
Return Me.yearField
End Get
Set
Me.yearField = value
End Set
End Property
<DataMember()> _
Public Property color() As String
Get
Return Me.colorField
End Get
Set
Me.colorField = value
End Set
End Property
Private extensionDataField As ExtensionDataObject
Public Property ExtensionData() As ExtensionDataObject _
Implements IExtensibleDataObject.ExtensionData
Get
Return Me.extensionDataField
End Get
Set(ByVal value As ExtensionDataObject)
Me.extensionDataField = value
End Set
End Property
End Class
请注意,生成的类型遵循多个数据协定最佳做法(在 最佳做法:数据协定版本控制中发现):
该类型实现 IExtensibleDataObject 接口。 有关详细信息,请参阅 Forward-Compatible 数据协定。
数据成员作为封装私有字段的公共属性来实现。
该类是分部类,无需修改生成的代码即可进行添加。
XsdDataContractExporter 使您能够进行反向操作,使用可用 DataContractSerializer
进行序列化的类型并生成 XSD 架构文档。
不保证保真度
不保证进行往返行程的架构或类型完全保真。 ( 往返 意味着导入架构以创建一组类,并导出结果以再次创建架构。可能不会返回相同的架构。 反向过程也不保证保真。 (导出类型以生成其架构,然后导入回类型。它不太可能返回相同的类型。
支持的类型
数据协定模型仅支持 WC3 架构的有限子集。 任何不符合此子集的架构都会在导入过程中引发异常。 例如,无法指定数据协定的数据成员应序列化为 XML 属性。 因此,不支持需要使用 XML 属性的架构,并且会导致导入期间出现异常,因为无法生成具有正确 XML 投影的数据协定。
例如,无法使用默认导入设置导入以下架构片段。
<xs:complexType name="Vehicle">
<xs:sequence>
<xs:element name="year" type="xs:int" />
<xs:element name="color" type="xs:string" />
</xs:sequence>
<xs:attribute name="engineHorsePower" type="xs:int" />
</xs:complexType>
有关详细信息,请参阅 数据协定架构参考。 如果架构不符合数据协定规则,请使用其他序列化引擎。 例如,该 XmlSerializer 函数使用其自己的独立架构导入机制。 此外,还有一种特殊的导入模式,在其中扩展了受支持的架构范围。 有关详细信息,请参阅“导入架构以生成类”中关于生成IXmlSerializable类型的章节。
XsdDataContractExporter
支持可以使用 DataContractSerializer
进行序列化的任何 .NET Framework 类型。 有关详细信息,请参阅 数据协定序列化程序支持的类型。 请注意,使用 XsdDataContractExporter
生成的架构通常是 XsdDataContractImporter
可以使用的有效数据(除非 XmlSchemaProviderAttribute 用于对架构进行自定义)。
有关使用 XsdDataContractImporter的详细信息,请参阅 导入架构以生成类。
有关使用 XsdDataContractExporter的详细信息,请参阅 从类导出架构。