数据协定架构参考
本主题介绍 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/@schemaLocation 和 xs:import/@location 引用。 在这种情况下,必须通过带外机制而非通过 include 来传递架构文件的列表;将忽略 include 架构文档。 |
redefine |
已禁止。 出于安全方面的原因, xs:redefine 禁止使用 DataContractSerializer : x:redefine 要求后跟 schemaLocation 。 在某些情况下,使用 DataContract 的 Svcutil.exe 会限制 schemaLocation 的使用。 |
import |
。 DataContractSerializer 支持 xs:include 和 xs:import 。 但是,从本地文件加载元数据时,Svcutil.exe 会限制下面的 xs:include/@schemaLocation 和 xs:import/@location 引用。 在这种情况下,必须通过带外机制而非通过 include 来传递架构文件的列表;将忽略 include 架构文档。 |
simpleType |
。 请参见“ xs:simpleType ”一节。 |
complexType |
支持,将映射到数据协定。 请参见“ xs:complexType ”一节。 |
group |
已忽略。 DataContractSerializer 不支持使用 xs:group 、 xs:attributeGroup 和 xs:attribute 。 这些声明将作为 xs:schema 子级被忽略,但无法从 complexType 或其他支持的结构内引用。 |
attributeGroup |
已忽略。 DataContractSerializer 不支持使用 xs:group 、 xs:attributeGroup 和 xs:attribute 。 这些声明将作为 xs:schema 子级被忽略,但无法从 complexType 或其他支持的结构内引用。 |
element |
。 请参见“全局元素声明 (GED)”。 |
attribute |
已忽略。 DataContractSerializer 不支持使用 xs:group 、 xs:attributeGroup 和 xs: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 可以是内部类型,但前提是 A 和 A.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>(集合)
在集合类型中,在 xs:sequence 内只允许一个 xs:element。
集合可以是以下类型之一:
常规集合(例如,数组)。
字典集合(将一个值映射到另一个值,例如 Hashtable)。
字典和密钥/值对类型的数组之间仅有的差别在于生成的编程模型。 有一种架构批注机制可用来指示给定的类型是一个字典集合。
ref
、 block
、 default
、 fixed
, form
和 id
属性的规则与非集合情况下的规则相同。 其他属性包含下表中的规则。
属性 | 架构 |
---|---|
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 |
已忽略。 |
(空白) | 。 |
* 使用 simpleType
匿名类型的映射 complexType
与非匿名类型映射时相同,只不过没有匿名数据协定,因此会创建命名数据协定,其生成的名称派生自元素名称。 下面的列表中是匿名类型的规则:
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 |
表示偏移量的DateTime 和 TimeSpan 。 请参见下面的“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(限定名)上存在不同,并且实际上是属性集合。 例如,DataContractSerializer
将 Exception 映射到 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 字符。valuespace
的xs: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>