データ コントラクト スキーマの参照
ここでは、XML シリアル化用の共通言語ランタイム (CLR) 型を表すために DataContractSerializer が使用する XML スキーマ (XSD) のサブセットについて説明します。
DataContractSerializer のマッピング
DataContractSerializer は、メタデータ エンドポイントや ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を使用してメタデータを Windows Communication Foundation (WCF) サービスからエクスポートするときに、CLR 型を XSD にマッピングします。詳細については、次のトピックを参照してください。 データ コントラクト シリアライザー.
また、DataContractSerializer は、Svcutil.exe を使用して Web サービス記述言語 (WSDL) や XSD ドキュメントにアクセスし、サービスまたはクライアントのデータ コントラクトを生成するときに、XSD を CLR 型にマッピングします。
DataContractSerializer を使用して CLR 型にマッピングできるのは、この文書に記載されている要件に適合する XML スキーマ インスタンスに限られます。
サポート レベル
DataContractSerializer は、特定の XML スキーマ機能に次のサポート レベルを提供します。
サポートあり。この機能から CLR 型または属性の一方または両方への、DataContractSerializer を使用する明示的なマッピングが存在します。
無視。この機能は、DataContractSerializer によってインポートされたスキーマで使用できますが、コードの生成に影響しません。
禁止。DataContractSerializer は、この機能を使用するスキーマのインポートをサポートしません。たとえば、Svcutil.exe は、この機能を使用するスキーマに基づいて WSDL にアクセスする場合、代わりに XmlSerializer を使用します。これが既定値です。
一般情報
スキーマ名前空間については、「XML Schema」を参照してください。このドキュメントでは、プレフィックス "xs" を使用しています。
スキーマ以外の名前空間を含む属性は無視されます。
注釈 (このドキュメントで説明しているものを除きます) はすべて無視されます。
<xs:schema>: 属性
属性 | DataContract |
---|---|
attributeFormDefault |
無視されます。 |
blockDefault |
無視されます。 |
elementFormDefault |
修飾する必要があります。DataContractSerializer でスキーマをサポートするには、すべての要素を修飾する必要があります。要素を修飾するには、xs:schema/@elementFormDefault を "qualified" に設定するか、個々の要素の宣言で xs:element/@form を "qualified" に設定します。 |
finalDefault |
無視されます。 |
Id |
無視されます。 |
targetNamespace |
サポートされます。データ コントラクト名前空間にマッピングされます。この属性を指定しなかった場合は、空の名前空間が使用されます。予約されている名前空間 https://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 |
禁止。セキュリティ上の理由により、DataContractSerializer では、xs:redefine の使用が禁止されています。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" の場合でも禁止です (ただし、例外が 1 つあります)。標準シリアル化スキーマ名前空間のオプションの属性のみがサポートされます。これらは、データ コントラクト プログラミング モデルのデータ メンバーにマッピングされません。現在、これらの属性で意味のあるものは 1 つだけです。詳細については、ISerializable のセクションを参照してください。他の属性はすべて無視されます。 |
attributeGroup |
禁止。WCF v1 リリースの DataContractSerializer では、xs:complexType 内部の attributeGroup の存在が無視されます。 |
anyAttribute |
禁止。 |
(空) |
データ メンバーを持たないデータ コントラクトにマッピングされます。 |
複合型での <xs:sequence> : 属性
属性 | スキーマ |
---|---|
id |
無視されます。 |
maxOccurs |
1 (既定) のみ有効です。 |
minOccurs |
1 (既定) のみ有効です。 |
複合型での <xs:sequence> : コンテンツ
コンテンツ | スキーマ |
---|---|
element |
各インスタンスがデータ メンバーにマッピングされます。 |
group |
禁止。 |
choice |
禁止。 |
sequence |
禁止。 |
any |
禁止。 |
(空) |
データ メンバーを持たないデータ コントラクトにマッピングされます。 |
要素 – <xs:element>
一般情報
<xs:element> は、次の構文で発生します。
<xs:sequence> 内で発生し、通常 (コレクション以外) のデータ コントラクトのデータ メンバーを表すことができます。この場合、maxOccurs 属性は 1 にする必要があります (値 0 は使用できません)。
<xs:sequence> 内で発生し、コレクション データ コントラクトのデータ メンバーを表すことができます。この場合、maxOccurs 属性は 2 以上の値か、"unbounded" にする必要があります。
<xs:schema> 内で GED (グローバル要素宣言) として発生します。
<xs:sequence> 内の maxOccurs=1 を持つ <xs:element> (データ メンバー)
属性 | スキーマ |
---|---|
ref |
禁止。 |
name |
サポートされます。データ メンバー名にマッピングされます。 |
type |
サポートされます。データ メンバー型にマッピングされます。詳細については、「型/プリミティブのマッピング」を参照してください。指定しない場合 (および要素に匿名型が含まれていない場合) は、xs:anyType が使用されます。 |
block |
無視されます。 |
default |
禁止。 |
fixed |
禁止。 |
form |
修飾する必要があります。この属性は、xs:schema の elementFormDefault を通じて設定できます。 |
id |
無視されます。 |
maxOccurs |
1 |
minOccurs |
データ メンバーの IsRequired プロパティにマッピングされます (minOccurs が 1 の場合、IsRequired は true です)。 |
nillable |
型のマッピングに影響します。「型/プリミティブのマッピング」を参照してください。 |
<xs:sequence> 内の maxOccurs>1 を持つ <xs:element> (コレクション)
CollectionDataContractAttribute にマッピングされます。
コレクションの型では、xs:sequence 内で xs:element を 1 つしか使用できません。
コレクションは次のいずれかになります。
標準コレクション (配列など)。
ディクショナリ コレクション (1 つの値を別の値にマッピングする、Hashtable など)。
- ディクショナリとキー/値ペアの配列の種類との唯一の相違は、生成されるプログラミング モデルにあります。特定の種類がディクショナリ コレクションであることを示すには、スキーマ注釈機構を使用できます。
ref、block、default、fixed、form、および id の各属性に対するルールは、コレクション以外の場合と同じです。その他に、次の表に示す属性があります。
属性 | スキーマ |
---|---|
name |
サポートされます。CollectionDataContractAttribute 属性の ItemName プロパティにマッピングされます。 |
type |
サポートされます。コレクションに格納されている型にマッピングされます。 |
maxOccurs |
2 以上または "unbounded"。DC スキーマでは、"unbounded" を使用する必要があります。 |
minOccurs |
無視されます。 |
nillable |
型のマッピングに影響します。この属性は、ディクショナリ コレクションでは無視されます。 |
<xs:schema> グローバル要素宣言内の <xs:element>
スキーマ内の型と同じ名前および名前空間を持つか、それ自体の内部で匿名型を定義するグローバル要素宣言 (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:enumeration 以外の制限ファセットを持たない xs:string の単純型制限は、列挙データ コントラクトにマッピングされます。
その他すべての単純型制限は、それぞれが制限する型にマッピングされます。たとえば、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 |
禁止。 |
(空) |
サポートされます。空の列挙型にマッピングされます。 |
次のコードは、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="https://schemas.microsoft.com/2003/10/Serialization/">
3
</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="second">
<xs:annotation>
<xs:appinfo>
<EnumerationValue
xmlns="https://schemas.microsoft.com/2003/10/Serialization/">
4
</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:list>
DataContractSerializer は、System.FlagsAttribute によってマークされた列挙型を、xs:string から派生した xs:list にマッピングします。これ以外の xs:list のバリエーションはサポートされません。
<xs:list> : 属性
属性 | スキーマ |
---|---|
itemType |
禁止。 |
id |
無視されます。 |
<xs:list> : コンテンツ
コンテンツ | スキーマ |
---|---|
simpleType |
xs:enumeration ファセットを使用する xs:string からの制限のみ有効です。 |
列挙値が 2 の累乗の数列 (フラグの既定) に従わない場合、値は xs:annotation/xs:appInfo/ser:EnumerationValue 要素に格納されます。
たとえば、次のコードは列挙型をフラグとして処理します。
[Flags]
public enum AuthFlags
{
AuthAnonymous = 1,
AuthBasic = 2,
AuthNTLM = 4,
AuthMD5 = 16,
AuthPassport = 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="https://schemas.microsoft.com/2003/10/Se
rialization/">16</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="AuthPassport">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="https://schemas.microsoft.com/2003/10/Se
rialization/">64</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
継承
一般ルール
データ コントラクトは、別のデータ コントラクトを継承できます。このようなデータ コントラクトは base にマッピングされ、<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:complexContent のコンテナーの下に xs:restriction のコンテンツを直接配置するのと同じです。 |
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 |
|
anySimpleType |
|
duration |
|
dateTime |
|
dateTimeOffset |
オフセットの DateTime および TimeSpan。後の「DateTimeOffset のシリアル化」を参照してください。 |
time |
String. |
date |
String. |
gYearMonth |
String. |
gYear |
String. |
gMonthDay |
String. |
gDay |
String. |
gMonth |
String. |
boolean |
|
base64Binary |
Byte 配列 |
hexBinary |
String. |
float |
|
double |
|
anyURI |
Uri. |
QName |
|
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 |
|
integer |
|
nonPositiveInteger |
Int64. |
negativeInteger |
Int64. |
long |
Int64. |
int |
|
short |
|
Byte |
|
nonNegativeInteger |
Int64. |
unsignedLong |
|
unsignedInt |
|
unsignedShort |
|
unsignedByte |
Byte. |
positiveInteger |
Int64. |
ISerializable 型のマッピング
.NET Framework Version 1.0 では、永続性の確保やデータ転送のためにオブジェクトをシリアル化する一般的な機構として ISerializable が導入されました。ISerializable を実装したり、アプリケーション間で受け渡したりできる、さまざまな .NET Framework 型があります。DataContractSerializer は、当然ながら ISerializable クラスをサポートします。DataContractSerializer は、型の QName (修飾名) のみが異なり、事実上プロパティ コレクションである ISerializable 実装スキーマ型をマッピングします。たとえば、DataContractSerializer は、http://schemas.datacontract.org/2004/07/System 名前空間にある次の XSD 型に Exception をマッピングします。
<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 によってエクスポートされたいくつかのスキーマでは、次の特別なデータ コントラクト シリアル化名前空間の型、要素、および属性を使用します。
https://schemas.microsoft.com/2003/10/Serialization
データ コントラクト シリアル化スキーマの完全な宣言を次に示します。
<xs:schema attributeFormDefault="qualified"
elementFormDefault="qualified"
targetNamespace =
"https://schemas.microsoft.com/2003/10/Serialization/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="https://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 文字を表現します。
xs:duration の valuespace を順序付きセットに縮小し、TimeSpan にマッピングできるようにします。
ISerializable から派生した型からエクスポートされたスキーマで FactoryType を使用します。
非 DataContract スキーマのインポート
DataContractSerializer には、DataContractSerializer XSD プロファイルに準拠しないスキーマのインポートを可能にする ImportXmlTypes オプションがあります (「Options プロパティ」を参照してください)。このオプションを true に設定すると、非準拠スキーマ型を受け入れ、それを次の実装 (XmlNode の配列をラップする IXmlSerializable) にマッピングできるようになります (クラス名のみ異なります)。
[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 はプリミティブ型としては扱われません。その代わりに、2 つの部分から成る複合型要素としてシリアル化されます。最初の部分は日時を表し、2 番目の部分は日時からのオフセットを表します。次のコード例に、シリアル化された DateTimeOffset 値を示します。
<OffSet xmlns:a="http://schemas.datacontract.org/2004/07/System">
<DateTime i:type="b:dateTime"
xmlns:b="http://www.w3.org/2001/XMLSchema">2008-08-28T08:00:00
</DateTime>
<OffsetMinutes i:type="b:short"
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:elementname="OffsetMinutes" type="xs:short"
minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:schema>
参照
リファレンス
DataContractSerializer
DataContractAttribute
DataMemberAttribute
XsdDataContractImporter