데이터 계약 스키마 참조
이 항목에서는 XML serialization에 대한 CLR(공용 언어 런타임) 형식을 설명하기 위해 DataContractSerializer에서 사용하는 XSD(XML 스키마) 하위 집합에 대해 설명합니다.
DataContractSerializer 매핑
DataContractSerializer는 메타데이터 끝점 또는 ServiceModel Metadata Utility Tool (Svcutil.exe)를 사용하여 WCF(Windows Communication Foundation) 서비스에서 메타데이터를 내보낼 때 CLR 형식을 XSD에 매핑합니다. 자세한 내용은 데이터 계약 Serializer를 참조하십시오.
또한 WSDL(웹 서비스 기술 언어) 또는 XSD 문서에 액세스하여 서비스 또는 클라이언트에 대한 데이터 계약을 생성하기 위해 Svcutil.exe를 사용하는 경우 DataContractSerializer는 XSD를 CLR 형식에 매핑합니다.
이 문서에 명시된 요구 사항을 준수하는 XML 스키마 인스턴스만 DataContractSerializer를 사용하여 CLR 형식에 매핑할 수 있습니다.
지원 수준
DataContractSerializer는 지정된 XML 스키마 기능에 대해 다음과 같은 수준의 지원을 제공합니다.
- 지원. DataContractSerializer를 사용하여 이 기능에서 CLR 형식 또는 특성(또는 둘 다)으로 명시적 매핑이 지원됩니다.
- 무시. DataContractSerializer가 가져온 스키마에 이 기능을 사용할 수 있지만 코드 생성에 영향을 주지는 않습니다.
- 사용할 수 없음. DataContractSerializer는 이 기능을 사용하여 스키마 가져오기 작업을 지원하지 않습니다. 예를 들어, 이러한 기능을 사용하는 스키마를 통해 WSDL에 액세스하는 경우 Svcutil.exe는 대신 XmlSerializer로 대체됩니다. 이 기능은 기본적으로 설정됩니다.
일반 정보
- 스키마 네임스페이스에 대해서는 XML 스키마(영문 페이지일 수 있음)에서 설명합니다. 이 문서에서는 접두사 "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가 아닌 out-of-band 메커니즘을 통해 전달해야 합니다. 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가 아닌 out-of-band 메커니즘을 통해 전달해야 합니다. 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"인 경우에도 사용할 수 없습니다. 표준 Serialization 스키마 네임스페이스에서 선택적 특성만 지원됩니다. 이러한 특성은 데이터 계약 프로그래밍 모델의 데이터 멤버에 매핑되지 않습니다. 현재 이러한 하나의 특성만 의미가 있으며, 여기에 대해서는 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 특성은 1보다 크거나 "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:element만 xs:sequence 내에 허용됩니다.
컬렉션은 다음 형식 중 하나일 수 있습니다.
- 정규 컬렉션(예: 배열)
- 사전 컬렉션(값을 다른 값에 매핑. 예: Hashtable)
- 사전과 키/값 쌍 형식의 배열 간 유일한 차이는 생성된 프로그래밍 모델에 있습니다. 지정된 형식이 사전 컬렉션임을 나타내는 데 사용할 수 있는 스키마 주석 메커니즘이 있습니다.
ref, block, default, fixed, form 및 id 특성에 대한 규칙이 비컬렉션의 경우와 동일합니다. 기타 특성은 다음 표에 포함되어 있습니다.
특성 | 스키마 |
---|---|
name |
지원되며 CollectionDataContractAttribute 특성의 ItemName 속성에 매핑됩니다. |
type |
지원되며 컬렉션에 저장된 형식에 매핑됩니다. |
maxOccurs |
1보다 크거나 "unbounded"입니다. DC 스키마는 "unbounded"를 사용해야 합니다. |
minOccurs |
무시됩니다. |
nillable |
형식 매핑에 영향을 줍니다. 이 특성은 사전 컬렉션에서 무시됩니다. |
<xs:schema> 전역 요소 선언 내의 <xs:element>
- 스키마의 형식과 동일한 이름 및 네임스페이스가 있거나 익명 형식을 정의하는 GED(전역 요소 선언)가 형식과 연결된 것으로 간주합니다.
- 스키마 내보내기: 연결된 GED가 생성된 모든 단순 및 복합 형식에 대해 생성됩니다.
- Deserialization/serialization: 연결된 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"는 무시되고 "value"는 열거형 데이터 계약의 값 이름에 매핑됩니다. |
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>
상속
일반 규칙
데이터 계약을 다른 데이터 계약에서 상속할 수 있습니다. 이러한 데이터 계약은 기본 계약에 매핑되고 <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 |
|
anySimpleType |
|
duration |
|
dateTime |
|
dateTimeOffset |
오프셋의 경우 DateTime 및 TimeSpan. 아래 DateTimeOffset Serialization을 참조하십시오. |
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 형식 매핑
ISerializable은 .NET Framework 버전 1.0에서 지속성이나 데이터 전송을 위해 개체를 serialize하는 일반 메커니즘으로 새로 추가되었습니다. ISerializable을 구현하고 응용 프로그램 간에 전달할 수 있는 다양한 .NET Framework 형식이 있습니다. DataContractSerializer는 기본적으로 ISerializable 클래스에 대한 지원을 제공합니다. DataContractSerializer는 형식의 QName(정규화된 이름)에 의해서만 달라지는 효율적인 속성 컬렉션인 ISerializable 구현 스키마 형식을 매핑합니다. 예를 들어, 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>
데이터 계약 Serialization 스키마에서 선언한 선택적 특성 ser:FactoryType은 형식을 deserialize할 수 있는 팩터리 클래스를 참조합니다. 팩터리 클래스는 사용 중인 DataContractSerializer 인스턴스의 알려진 형식 컬렉션의 일부여야 합니다. 알려진 형식에 대한 자세한 내용은 데이터 계약 알려진 형식을 참조하십시오.
DataContract Serialization 스키마
DataContractSerializer에서 내보낸 여러 스키마는 다음과 같은 특별한 데이터 계약 Serialization 네임스페이스의 형식, 요소 및 특성을 사용합니다.
https://schemas.microsoft.com/2003/10/Serialization
다음은 전체 데이터 계약 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 형식의 유니코드 문자를 표시하기 위해 도입됩니다.
- xs:duration의 valuespace는 TimeSpan에 매핑될 수 있도록 정렬된 집합으로 축소됩니다.
- FactoryType은 ISerializable에서 파생된 형식에서 내보낸 스키마에서 사용됩니다.
DataContract가 아닌 스키마 가져오기
DataContractSerializer에는 DataContractSerializer XSD 프로필을 준수하지 않는 스키마를 가져올 수 있는 ImportXmlTypes 옵션이 포함되어 있습니다. 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 Serialization
DateTimeOffset은 기본 형식으로 취급되지 않습니다. 대신 두 부분으로 구성된 복합 요소로 serialize됩니다. 첫 번째 부분은 날짜/시간을 표시하고 두 번째 부분은 날짜/시간의 오프셋을 표시합니다. 다음 코드에서는 serialize된 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