数据协定架构参考

本主题介绍 DataContractSerializer 用来描述 XML 序列化的公共语言运行库 (CLR) 类型的 XML 架构 (XSD) 的子集。

DataContractSerializer 映射

在使用元数据终结点或 ServiceModel 元数据实用工具 (Svcutil.exe) 从 Windows Communication Foundation (WCF) 服务中导出元数据时,DataContractSerializer 将 CLR 类型映射到 XSD。 有关详细信息,请参阅数据协定序列化程序

在使用 Svcutil.exe 访问 Web 服务描述语言 (WSDL) 或 XSD 并生成服务或客户端的数据协定时, DataContractSerializer 还会将 XSD 映射到 CLR 类型。

只有符合此文档中所述需要的 XML 架构实例才可以使用 DataContractSerializer映射到 CLR 类型。

支持级别

DataContractSerializer 提供对于给定的 XML 架构功能提供以下支持级别:

  • 受支持。 从此功能到使用 DataContractSerializer的 CLR 类型或属性(或二者)具有显式映射。

  • 已忽略。 在 DataContractSerializer导入的架构中允许此功能,当对代码生成无任何影响。

  • 已禁止DataContractSerializer 不支持导入使用此功能的架构。 例如,Svcutil.exe 在访问带有使用这类功能的架构的 WSDL 时会转而改用 XmlSerializer 。 这是默认设置。

常规信息

  • 架构命名空间在 XML 架构中描述。 在此文档中使用前缀“xs”。

  • 将忽略具有非架构命名空间的任何属性。

  • 将忽略任何批注(在此文档中描述的批注除外)。

<xs:schema>:属性

属性 DataContract
attributeFormDefault 已忽略。
blockDefault 已忽略。
elementFormDefault 必须进行限定。 必须对一个架构的所有元素进行限定才能得到 DataContractSerializer的支持。 这可以通过将 xs:schema/@elementFormDefault 设置为“qualified”或在每个单独元素声明上将 xs:element/@form 设置为“qualified”来完成。
finalDefault 已忽略。
Id 已忽略。
targetNamespace 支持,并已映射到数据协定命名空间。 如果未指定此属性,则使用空白命名空间。 不能是保留的命名空间 http://schemas.microsoft.com/2003/10/Serialization/
version 已忽略。

<xs:schema>:内容

目录 架构
include DataContractSerializer 支持 xs:include 和 xs:import。 但是,从本地文件加载元数据时,Svcutil.exe 会限制下面的 xs:include/@schemaLocationxs:import/@location 引用。 在这种情况下,必须通过带外机制而非通过 include 来传递架构文件的列表;将忽略 include架构文档。
redefine 已禁止。 出于安全方面的原因, xs:redefine 禁止使用 DataContractSerializerx:redefine 要求后跟 schemaLocation 。 在某些情况下,使用 DataContract 的 Svcutil.exe 会限制 schemaLocation的使用。
import DataContractSerializer 支持 xs:includexs:import。 但是,从本地文件加载元数据时,Svcutil.exe 会限制下面的 xs:include/@schemaLocationxs:import/@location 引用。 在这种情况下,必须通过带外机制而非通过 include 来传递架构文件的列表;将忽略 include架构文档。
simpleType 。 请参见“ xs:simpleType ”一节。
complexType 支持,将映射到数据协定。 请参见“ xs:complexType ”一节。
group 已忽略。 DataContractSerializer 不支持使用 xs:groupxs:attributeGroupxs:attribute。 这些声明将作为 xs:schema子级被忽略,但无法从 complexType 或其他支持的结构内引用。
attributeGroup 已忽略。 DataContractSerializer 不支持使用 xs:groupxs:attributeGroupxs:attribute。 这些声明将作为 xs:schema子级被忽略,但无法从 complexType 或其他支持的结构内引用。
element 。 请参见“全局元素声明 (GED)”。
attribute 已忽略。 DataContractSerializer 不支持使用 xs:groupxs:attributeGroupxs:attribute。 这些声明将作为 xs:schema子级被忽略,但无法从 complexType 或其他支持的结构内引用。
notation 已忽略。

复杂类型 — <xs:complexType>

常规信息

每个复杂类型 <xs:complexType> 都映射到一个数据协定。

<xs:complexType>:属性

属性 架构
abstract 必须是 false(默认值)。
block 已禁止。
final 已忽略。
id 已忽略。
mixed 必须是 false(默认值)。
name 支持,并已映射到数据协定名称。 如果名称中有句点,则尝试将类型映射到内部类型。 例如,名为 A.B 的复杂类型将映射到一个数据协定类型,该数据协定类型是具有数据协定名称 A的类型的内部类型,但前提是这种数据协定类型存在。 嵌套可能有多个级别:例如, A.B.C 可以是内部类型,但前提是 AA.B 两者都存在。

<xs:complexType>:内容

目录 架构
simpleContent 禁止扩展。

仅允许从 anySimpleType进行限制。
complexContent 。 请参见“继承”。
group 已禁止。
all 已禁止。
choice 禁止
sequence 支持,将映射到数据协定的数据成员。
attribute 已禁止,即使 use="prohibited"(但有一个例外)。 只支持标准序列化架构命名空间中的可选属性。 这些属性不映射到数据协定编程模型中的数据成员。 当前,仅有一个这样的属性有意义,将在“ISerializable”一节讨论。 将忽略所有其他成员。
attributeGroup 已禁止。 在 WCF v1 版本中,DataContractSerializer 将忽略 xs:complexType 内是否存在 attributeGroup
anyAttribute 已禁止。
(empty) 映射到没有数据成员的数据协定。

复杂类型中的 <xs:sequence>:属性

属性 架构
id 已忽略。
maxOccurs 必须是 1(默认值)。
minOccurs 必须是 1(默认值)。

复杂类型中的 <xs:sequence>:内容

目录 架构
element 每个实例都映射到一个数据成员。
group 已禁止。
choice 已禁止。
sequence 已禁止。
any 已禁止。
(empty) 映射到没有数据成员的数据协定。

元素 — <xs:element>

常规信息

<xs:element> 会在以下上下文中发生:

  • 在描述常规(非集合)数据协定的数据成员的 <xs:sequence>内发生。 在这种情况下, maxOccurs 属性必须为 1。 (不允许值为 0。)

  • 在描述集合数据协定的数据成员的 <xs:sequence>内发生。 在这种情况下, maxOccurs 属性必须大于 1 或为“unbounded”。

  • 在作为全局元素声明 (GED) 的 <xs:schema> 内发生。

<xs:sequence> 内 maxOccurs=1 的 <xs:element>(数据成员)

属性 架构
ref 已禁止。
name 支持,映射到数据成员名称。
type 支持,映射到数据成员类型。 有关更多信息,请参见“类型/基元映射”。 如果未指定(并且元素不包含匿名类型),则假定 xs:anyType
block 已忽略。
default 已禁止。
fixed 已禁止。
form 必须进行限定。 可以通过 elementFormDefault 上的 xs:schema来设置此特性。
id 已忽略。
maxOccurs 1
minOccurs 映射到数据成员的 IsRequired 属性(当IsRequired 为 1 时, minOccurs 为 true)。
nillable 影响类型映射。 请参见“类型/基元映射”。

<xs:sequence> 内 maxOccurs>1 的 <xs:element>(集合)

集合可以是以下类型之一:

  • 常规集合(例如,数组)。

  • 字典集合(将一个值映射到另一个值,例如 Hashtable)。

  • 字典和密钥/值对类型的数组之间仅有的差别在于生成的编程模型。 有一种架构批注机制可用来指示给定的类型是一个字典集合。

refblockdefaultfixed, formid 属性的规则与非集合情况下的规则相同。 其他属性包含下表中的规则。

属性 架构
name 支持,映射到 ItemName 属性 (Attribute) 中的 CollectionDataContractAttribute 属性 (Property)。
type 支持,映射到集合中存储的类型。
maxOccurs 大于 1 或为“unbounded”。 DC 架构应使用“unbounded”。
minOccurs 已忽略。
nillable 影响类型映射。 对于字典集合,忽略此属性。

<xs:schema> 全局元素声明内的 <xs:element>

  • 在架构中的某个类型时具有相同的名称和命名空间的全局元素声明 (GED) 或在其内部指定匿名类型的全局元素声明 (GED) 可认为是与该类型相关联。

  • 架构导出:将为每个生成的(简单的和复杂的)类型生成相关联的 GED。

  • 反序列化/序列化:将关联的 GED 用作类型的根元素。

  • 架构导入:当关联的 GED 遵循以下规则时,将不是必需的并可忽略(除非它们定义了类型)。

属性 架构
abstract 对于关联的 GED 必须是 false。
block 在关联的 GED 中禁止。
default 在关联的 GED 中禁止。
final 对于关联的 GED 必须是 false。
fixed 在关联的 GED 中禁止。
id 已忽略。
name 。 请参见关联的 GED 的定义。
nillable 对于关联的 GED 必须是 true。
substitutionGroup 在关联的 GED 中禁止。
type 支持,必须与关联的 GED 的关联类型相匹配(除非该元素包含一个匿名类型)。

<xs:element>:内容

目录 架构
simpleType 支持。*
complexType 支持。*
unique 已忽略。
key 已忽略。
keyref 已忽略。
(空白)

* 在使用 simpleTypecomplexType, 时,匿名类型的映射与非匿名类型的映射相同,只不过没有匿名数据协定,因而创建了一个命名数据协定,其生成的名称派生自元素名。 下面的列表中是匿名类型的规则:

  • WCF 实现详细信息:如果 xs:element 名称不包含句点,则匿名类型映射到外部数据协定类型的内部类型。 如果名称包含句点,则结果数据协定类型是独立的(不是内部类型)。

  • 内部类型的生成数据协定名称是由外部类型的数据协定名称后跟一个句点、元素名称和字符串“Type”构成。

  • 如果已存在具有这个名称的数据协定,则通过在该名称后追加“1”、“2”、“3”等以使名称具有唯一性,从而创建一个唯一的名称。

简单类型 — <xs:simpleType>

<xs:simpleType>:属性

属性 架构
final 已忽略。
id 已忽略。
name 支持,映射到数据协定名称。

<xs:simpleType>:内容

目录 架构
restriction 。 映射到枚举数据协定。 如果与枚举模式不匹配,则忽略此属性。 请参见“ xs:simpleType 限制”一节。
list 。 映射到标志枚举数据协定。 请参见“ xs:simpleType 列表”一节。
union 已禁止。

<xs:restriction>

  • 仅 base="xs:anyType" 支持复杂类型限制。

  • xs:string 之外没有任何限制方面的 xs:enumeration 的简单类型限制映射到枚举数据协定。

  • 将所有其他简单类型限制映射到它们限制的类型。 例如, xs:int 的限制将映射到一个整数,就像 xs:int 自身一样。 有关基元类型映射的详细信息,请参阅类型/基元映射。

<xs:restriction>:属性

属性 架构
base 必须是一个支持的简单类型或 xs:anyType
id 已忽略。

所有其他情况下的 <xs:restriction>:内容

目录 架构
simpleType 如果存在,必须派生自支持的基元类型。
minExclusive 已忽略。
minInclusive 已忽略。
maxExclusive 已忽略。
maxInclusive 已忽略。
totalDigits 已忽略。
fractionDigits 已忽略。
length 已忽略。
minLength 已忽略。
maxLength 已忽略。
enumeration 已忽略。
whiteSpace 已忽略。
pattern 已忽略。
(空白)

枚举

枚举的 <xs:restriction>:属性

属性 架构
base 如果存在,必须是 xs:string
id 已忽略。

枚举的 <xs:restriction>:内容

目录 架构
simpleType 如果存在,必须是数据协定支持的枚举限制(本节)。
minExclusive 已忽略。
minInclusive 已忽略。
maxExclusive 已忽略。
maxInclusive 已忽略。
totalDigits 已忽略。
fractionDigits 已忽略。
length 已禁止。
minLength 已禁止。
maxLength 已禁止。
enumeration 。 忽略枚举“id”,并且“值”映射到枚举数据协定上的值名称。
whiteSpace 已禁止。
pattern 已禁止。
(empty) 支持,映射到空枚举类型。

下面的代码演示 C# 枚举类。

public enum MyEnum
{
  first = 3,
  second = 4,
  third =5
}

此类通过 DataContractSerializer映射到下面的架构。 如果枚举值从 1 开始,则不生成 xs:annotation 块。

<xs:simpleType name="MyEnum">
  <xs:restriction base="xs:string">
    <xs:enumeration value="first">
      <xs:annotation>
        <xs:appinfo>
          <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
          3
          </EnumerationValue>
        </xs:appinfo>
      </xs:annotation>
    </xs:enumeration>
    <xs:enumeration value="second">
      <xs:annotation>
        <xs:appinfo>
          <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
          4
          </EnumerationValue>
        </xs:appinfo>
      </xs:annotation>
    </xs:enumeration>
  </xs:restriction>
</xs:simpleType>

<xs:list>

DataContractSerializer 将用 System.FlagsAttribute 标记的枚举类型映射到从 xs:list 派生的 xs:string。 不支持其他 xs:list 变体。

<xs:list>:属性

属性 架构
itemType 已禁止。
id 已忽略。

<xs:list>:内容

目录 架构
simpleType 必须是来自使用 xs:string 方面的 xs:enumeration 的限制。

如果枚举值后面没有 2 的幂级数(标志的默认值),则在 xs:annotation/xs:appInfo/ser:EnumerationValue 元素中存储值。

例如,下面的代码标志一个枚举类型。

[Flags]
public enum AuthFlags
{
  AuthAnonymous = 1,
  AuthBasic = 2,
  AuthNTLM = 4,
  AuthMD5 = 16,
  AuthWindowsLiveID = 64,
}

此类型映射到下面的架构。

<xs:simpleType name="AuthFlags">
    <xs:list>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="AuthAnonymous" />
          <xs:enumeration value="AuthBasic" />
          <xs:enumeration value="AuthNTLM" />
          <xs:enumeration value="AuthMD5">
            <xs:annotation>
              <xs:appinfo>
                <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">16</EnumerationValue>
              </xs:appinfo>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="AuthWindowsLiveID">
            <xs:annotation>
              <xs:appinfo>
                <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">64</EnumerationValue>
              </xs:appinfo>
            </xs:annotation>
          </xs:enumeration>
        </xs:restriction>
      </xs:simpleType>
    </xs:list>
  </xs:simpleType>

继承

一般规则

数据协定可以继承自另一个数据协定。 这类数据协定映射到一个基协定,并由扩展类型使用 <xs:extension> XML 架构协定进行派生。

数据协定不能继承自集合数据协定。

例如,下面的代码是数据协定。

[DataContract]
public class Person
{
  [DataMember]
  public string Name;
}
[DataContract]
public class Employee : Person
{
  [DataMember]
  public int ID;
}

此数据协定映射到下面的 XML 架构类型声明。

<xs:complexType name="Employee">
 <xs:complexContent mixed="false">
  <xs:extension base="tns:Person">
   <xs:sequence>
    <xs:element minOccurs="0" name="ID" type="xs:int"/>
   </xs:sequence>
  </xs:extension>
 </xs:complexContent>
</xs:complexType>
<xs:complexType name="Person">
 <xs:sequence>
  <xs:element minOccurs="0" name="Name"
    nillable="true" type="xs:string"/>
 </xs:sequence>
</xs:complexType>

<xs:complexContent>:属性

属性 架构
id 已忽略。
mixed 必须是 false。

<xs:complexContent>:内容

目录 架构
restriction 已禁止,除了 base="xs:anyType"。 后者等效于将 xs:restriction 的内容直接放到 xs:complexContent的容器下。
extension 。 映射到数据协定继承。

<xs:complexContent> 中的 <xs:extension>:属性

属性 架构
id 已忽略。
base 。 映射到此类型继承自的基数据协定类型。

<xs:complexContent> 中的 <xs:extension>:内容

规则与 <xs:complexType> 内容的规则相同。

如果提供 <xs:sequence> ,则其成员元素将映射到存在于派生的数据协定中的附加数据成员。

如果派生的类型包含与基类型中的元素有相同名称的元素,则重复元素声明映射到一个具有生成的唯一名称的数据成员。 将向数据成员名称添加正整数数字(“member1”、“member2”等)直至查找到唯一的名称。 相反:

  • 如果派生的数据协定有一个数据成员与基数据协定中的数据成员具有相同的名称和类型,则 DataContractSerializer 在派生的类型中生成此对应的元素。

  • 如果派生的数据协定有一个数据成员与基数据协定中的数据成员具有相同的名称,但类型不同,则 DataContractSerializer 使用基类型和派生的类型声明中的 xs:anyType 类型的元素导入架构。 在 xs:annotations/xs:appInfo/ser:ActualType/@Name中保留原始类型名称。

两个变体可能会导致一个使用有歧义的内容模型的架构,此内容模型取决于各自数据成员的顺序。

类型/基元映射

DataContractSerializer 使用下面的 XML 架构基元类型映射。

XSD 类型 .NET 类型
anyType Object.
anySimpleType String.
duration TimeSpan.
dateTime DateTime.
dateTimeOffset 表示偏移量的DateTimeTimeSpan 。 请参见下面的“DateTimeOffset 序列化”。
time String.
date String.
gYearMonth String.
gYear String.
gMonthDay String.
gDay String.
gMonth String.
boolean Boolean
base64Binary Byte 数组。
hexBinary String.
float Single.
double Double.
anyURI Uri.
QName XmlQualifiedName.
string String.
normalizedString String.
token String.
language String.
Name String.
NCName String.
ID String.
IDREF String.
IDREFS String.
ENTITY String.
ENTITIES String.
NMTOKEN String.
NMTOKENS String.
decimal Decimal.
integer Int64.
nonPositiveInteger Int64.
negativeInteger Int64.
long Int64.
int Int32.
short Int16.
Byte SByte.
nonNegativeInteger Int64.
unsignedLong UInt64.
unsignedInt UInt32.
unsignedShort UInt16.
unsignedByte Byte.
positiveInteger Int64.

ISerializable 类型映射

在 .NET Framework 版本 1.0 中,已将 ISerializable 作为一种用于序列化持久化或数据传输对象的机制引入。 有许多实现 ISerializable 的 .NET Framework 类型,这些类型可在应用程序之间进行传递。 DataContractSerializer 自然支持 ISerializable 类。 DataContractSerializer 映射到 ISerializable 实现架构类型,这些类型仅在类型的 QName(限定名)上存在不同,并且实际上是属性集合。 例如,DataContractSerializerException 映射到 http://schemas.datacontract.org/2004/07/System 命名空间中的以下 XSD 类型。

<xs:complexType name="Exception">
 <xs:sequence>
  <xs:any minOccurs="0" maxOccurs="unbounded"
      namespace="##local" processContents="skip"/>
 </xs:sequence>
 <xs:attribute ref="ser:FactoryType"/>
</xs:complexType>

数据协定序列化架构中声明的可选属性 ser:FactoryType 引用可以反序列化类型的工厂类。 工厂类必须是正在使用的 DataContractSerializer 实例的已知类型集合的一部分。 有关已知类型的详细信息,请参阅数据协定已知类型

DataContract 序列化架构

许多由 DataContractSerializer 导出的架构都使用一个特殊数据协定序列化命名空间中的类型、元素和属性:

http://schemas.microsoft.com/2003/10/Serialization

下面是一个完整的数据协定序列化架构声明。

<xs:schema attributeFormDefault="qualified"
   elementFormDefault="qualified"
   targetNamespace =
    "http://schemas.microsoft.com/2003/10/Serialization/"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/">

 <!-- Top-level elements for primitive types. -->
 <xs:element name="anyType" nillable="true" type="xs:anyType"/>
 <xs:element name="anyURI" nillable="true" type="xs:anyURI"/>
 <xs:element name="base64Binary"
       nillable="true" type="xs:base64Binary"/>
 <xs:element name="boolean" nillable="true" type="xs:boolean"/>
 <xs:element name="byte" nillable="true" type="xs:byte"/>
 <xs:element name="dateTime" nillable="true" type="xs:dateTime"/>
 <xs:element name="decimal" nillable="true" type="xs:decimal"/>
 <xs:element name="double" nillable="true" type="xs:double"/>
 <xs:element name="float" nillable="true" type="xs:float"/>
 <xs:element name="int" nillable="true" type="xs:int"/>
 <xs:element name="long" nillable="true" type="xs:long"/>
 <xs:element name="QName" nillable="true" type="xs:QName"/>
 <xs:element name="short" nillable="true" type="xs:short"/>
 <xs:element name="string" nillable="true" type="xs:string"/>
 <xs:element name="unsignedByte"
       nillable="true" type="xs:unsignedByte"/>
 <xs:element name="unsignedInt"
       nillable="true" type="xs:unsignedInt"/>
 <xs:element name="unsignedLong"
       nillable="true" type="xs:unsignedLong"/>
 <xs:element name="unsignedShort"
       nillable="true" type="xs:unsignedShort"/>

 <!-- Primitive types introduced for certain .NET simple types. -->
 <xs:element name="char" nillable="true" type="tns:char"/>
 <xs:simpleType name="char">
  <xs:restriction base="xs:int"/>
 </xs:simpleType>

 <!-- xs:duration is restricted to an ordered value space,
    to map to System.TimeSpan -->
 <xs:element name="duration" nillable="true" type="tns:duration"/>
 <xs:simpleType name="duration">
  <xs:restriction base="xs:duration">
   <xs:pattern
     value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?"/>
   <xs:minInclusive value="-P10675199DT2H48M5.4775808S"/>
   <xs:maxInclusive value="P10675199DT2H48M5.4775807S"/>
  </xs:restriction>
 </xs:simpleType>

 <xs:element name="guid" nillable="true" type="tns:guid"/>
 <xs:simpleType name="guid">
  <xs:restriction base="xs:string">
   <xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}"/>
  </xs:restriction>
 </xs:simpleType>

 <!-- This is used for schemas exported from ISerializable type. -->
 <xs:attribute name="FactoryType" type="xs:QName"/>
</xs:schema>

应注意以下事项:

  • 已引入ser:char 来表示 Char类型的 Unicode 字符。

  • valuespacexs:duration 已简化为一个有序集,因此可以将其映射到 TimeSpan

  • 在从派生自FactoryType 的类型中导出的架构中使用 ISerializable

导入非 DataContract 架构

DataContractSerializer 具有 ImportXmlTypes 选项,可允许导入不符合 DataContractSerializer XSD 配置文件的架构(请参见 Options 属性)。 将此选项设置为 true 可接受不符合要求的架构类型,并将其映射到下面的实现,即包装 IXmlSerializable 数组的 XmlNode (仅类名称不同)。

[GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Xml.Serialization.XmlSchemaProviderAttribute("ExportSchema")]
[System.Xml.Serialization.XmlRootAttribute(IsNullable=false)]
public partial class Person : object, IXmlSerializable
{
  private XmlNode[] nodesField;
  private static XmlQualifiedName typeName =
new XmlQualifiedName("Person","http://Microsoft.ServiceModel.Samples");
  public XmlNode[] Nodes
  {
    get {return this.nodesField;}
    set {this.nodesField = value;}
  }
  public void ReadXml(XmlReader reader)
  {
    this.nodesField = XmlSerializableServices.ReadNodes(reader);
  }
  public void WriteXml(XmlWriter writer)
  {
    XmlSerializableServices.WriteNodes(writer, this.Nodes);
  }
  public System.Xml.Schema.XmlSchema GetSchema()
  {
    return null;
  }
  public static XmlQualifiedName ExportSchema(XmlSchemaSet schemas)
  {
    XmlSerializableServices.AddDefaultSchema(schemas, typeName);
    return typeName;
  }
}

DateTimeOffset 序列化

未将 DateTimeOffset 视为基元类型, 而是将其序列化为具有两部分的复杂元素。 第一部分表示日期时间,第二部分表示日期时间的偏移量。 在下面的代码中演示已序列化的 DateTimeOffset 值的示例。

<OffSet xmlns:a="http://schemas.datacontract.org/2004/07/System">
  <DateTime i:type="b:dateTime" xmlns=""
    xmlns:b="http://www.w3.org/2001/XMLSchema">2008-08-28T08:00:00
  </DateTime>
  <OffsetMinutes i:type="b:short" xmlns=""
   xmlns:b="http://www.w3.org/2001/XMLSchema">-480
   </OffsetMinutes>
</OffSet>

相应的架构如下所示。

<xs:schema targetNamespace="http://schemas.datacontract.org/2004/07/System">
   <xs:complexType name="DateTimeOffset">
      <xs:sequence minOccurs="1" maxOccurs="1">
         <xs:element name="DateTime" type="xs:dateTime"
         minOccurs="1" maxOccurs="1" />
         <xs:element name="OffsetMinutes" type="xs:short"
         minOccurs="1" maxOccurs="1" />
      </xs:sequence>
   </xs:complexType>
</xs:schema>

请参阅