架构导入和导出
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 接口。 有关详细信息,请参阅向前兼容的数据协定。
数据成员作为封装私有字段的公共属性来实现。
此类是一个分部类,不修改生成的代码就可以添加内容。
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 的详细信息,请参阅从类导出架构。