架构导入和导出
Windows Communication Foundation (WCF) 包括新序列化引擎 DataContractSerializer。DataContractSerializer 在 .NET Framework 对象和 XML 之间进行转换(双向)。除了序列化程序本身,WCF 还包括关联的架构导入和架构导出机制。“架构”**是对序列化程序生成的或反序列化程序可以访问的 XML 形状的进行正式、精确、计算机可读的说明。WCF 使用万维网联合会 (W3C) XML 架构定义语言 (XSD) 作为其架构表示形式,这种语言可与众多第三方平台广泛进行互操作。
架构导入组件 XsdDataContractImporter 使用 XSD 架构文档并生成 .NET Framework 类(通常为数据协定类),使序列化格式对应于给定架构。
例如,以下架构片段:
<xs:complexType name="Vehicle">
<xs:sequence>
<xs:element name="year" type="xs:int" />
<xs:element name="color" type="xs:string" />
</xs:sequence>
</xs:complexType>
生成以下类型(略经简化以便于阅读)。
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
[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;}
}
}
请注意,生成的类型遵循多种数据协定最佳做法(请参见最佳做法:数据协定版本管理):
此类型实现 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 的更多信息,请参见从类导出架构。
另请参见
参考
DataContractSerializer
XsdDataContractImporter
XsdDataContractExporter