WCF(Windows Communication Foundation) 데이터 계약 모델은 XML을 직접 나타내는 특정 형식을 지원합니다. 이러한 형식이 XML로 직렬화되면 serializer는 추가 처리 없이 이러한 형식의 XML 콘텐츠를 작성합니다. 지원되는 유형은 XmlElement와 XmlNode을 구현하는 형식뿐만 아니라 XmlNode 형식 자체가 아니라 IXmlSerializable의 배열입니다.
DataSet
DataTable 형식화된 데이터 세트 및 형식은 데이터베이스 프로그래밍에서 일반적으로 사용됩니다. 이러한 형식은 인터페이스를 IXmlSerializable 구현하므로 데이터 계약 모델에서 직렬화할 수 있습니다. 이러한 형식에 대한 몇 가지 특별한 고려 사항은 이 항목의 끝에 나와 있습니다.
XML 형식
Xml 요소
XmlElement 형식은 XML 콘텐츠를 사용하여 직렬화됩니다. 예를 들어 다음 형식을 사용하세요.
[DataContract(Namespace=@"http://schemas.contoso.com")]
public class MyDataContract
{
[DataMember]
public XmlElement myDataMember;
public void TestClass()
{
XmlDocument xd = new XmlDocument();
myDataMember = xd.CreateElement("myElement");
myDataMember.InnerText = "myContents";
myDataMember.SetAttribute
("myAttribute","myValue");
}
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
<DataMember()> _
Public myDataMember As XmlElement
Public Sub TestClass()
Dim xd As New XmlDocument()
myDataMember = xd.CreateElement("myElement")
myDataMember.InnerText = "myContents"
myDataMember.SetAttribute("myAttribute", "myValue")
End Sub
End Class
다음과 같이 XML로 직렬화됩니다.
<MyDataContract xmlns="http://schemas.contoso.com">
<myDataMember>
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
</myDataMember>
</MyDataContract>
래퍼 데이터 멤버 요소 <myDataMember>는 여전히 존재합니다. 데이터 계약 모델에서 이 요소를 제거할 수 있는 방법은 없습니다. 이 모델(DataContractSerializer 및 NetDataContractSerializer)을 처리하는 serializer는 특수 속성들을 이 래퍼 요소로 내보낼 수 있습니다. 이러한 특성에는 표준 XML 스키마 인스턴스 "nil" 특성(허용 XmlElementnull) 및 "type" 특성(다형적으로 사용할 수 있도록 허용 XmlElement )이 포함됩니다. 또한 다음 XML 특성은 WCF와 관련이 있습니다. "Id", "Ref", "Type" 및 "Assembly". 이러한 특성은 개체 그래프 보존 모드를 XmlElement와 함께 사용하도록 설정하거나 NetDataContractSerializer와 함께 지원하는 데 필요할 수 있습니다. 개체 그래프 보존 모드에 대한 자세한 내용은 Serialization 및 Deserialization을 참조하세요.
배열 또는 컬렉션은 XmlElement 허용되며 다른 배열 또는 컬렉션으로 처리됩니다. 즉, 전체 컬렉션에 대한 래퍼 요소와 배열의 각 <myDataMember>에 대한 별도의 래퍼 요소(XmlElement 이전 예제와 유사)가 있습니다.
역직렬화 시, 역직렬 변환기가 들어오는 XML에서 XmlElement 객체를 생성합니다. 역직렬 변환기에서 유효한 부모가 XmlDocument 제공됩니다.
역직렬화된 XmlElement XML 조각이 사용하는 모든 접두사를 정의하고 상위 요소의 접두사 정의를 사용하지 않는지 확인합니다. 이는 다른(비DataContractSerializer) 원본에서 XML에 DataContractSerializer 액세스하는 데 사용하는 경우에만 문제가 됩니다.
와 함께 DataContractSerializerXmlElement 사용하면 다형적으로 할당될 수 있지만 형식Object의 데이터 멤버에만 할당될 수 있습니다.
IEnumerable를 구현하더라도 XmlElement는 컬렉션 형식으로 사용할 수 없으며 IEnumerable 데이터 멤버로 할당할 수 없습니다. 모든 다형 할당과 마찬가지로 결과 DataContractSerializer XML에서 데이터 계약 이름을 내보낸다. 이 경우 네임스페이스의 "XmlElement" http://schemas.datacontract.org/2004/07/System.Xml 입니다.
이 경우 NetDataContractSerializer유효한 다형 할당 XmlElement (to Object 또는 IEnumerable)이 지원됩니다.
XmlElement에서 파생된 형식의 경우, 다형적으로 할당되었는지에 관계없이 serializer 중 하나를 사용하지 마세요.
XmlNode 배열
XmlNode 배열을 사용하는 것은 XmlElement 사용하는 것과 매우 유사합니다.
XmlNode 배열을 사용하는 것이 XmlElement를 사용하는 것보다 더 유연합니다. 데이터 멤버 래핑 요소 내에 여러 요소를 쓸 수 있습니다. XML 주석과 같은 데이터 멤버 래핑 요소 내부에 요소 이외의 콘텐츠를 삽입할 수도 있습니다. 마지막으로 래핑 데이터 멤버 요소에 특성을 넣을 수 있습니다. 이 모든 작업은 XmlNode, XmlNode 또는 XmlAttribute와 같은 XmlElement의 특정 파생 클래스를 사용하여 배열 XmlComment을 채워서 달성할 수 있습니다. 예를 들어 다음 형식을 사용하세요.
[DataContract(Namespace="http://schemas.contoso.com")]
public class MyDataContract
{
[DataMember]
public XmlNode[] myDataMember = new XmlNode[4];
public void TestClass()
{
XmlDocument xd = new XmlDocument();
XmlElement xe = xd.CreateElement("myElement");
xe.InnerText = "myContents";
xe.SetAttribute
("myAttribute","myValue");
XmlAttribute atr = xe.Attributes[0];
XmlComment cmnt = xd.CreateComment("myComment");
myDataMember[0] = atr;
myDataMember[1] = cmnt;
myDataMember[2] = xe;
myDataMember[3] = xe;
}
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
<DataMember()> _
Public myDataMember(3) As XmlNode
Public Sub TestClass()
Dim xd As New XmlDocument()
Dim xe As XmlElement = xd.CreateElement("myElement")
xe.InnerText = "myContents"
xe.SetAttribute("myAttribute", "myValue")
Dim atr As XmlAttribute = xe.Attributes(0)
Dim cmnt As XmlComment = xd.CreateComment("myComment")
myDataMember(0) = atr
myDataMember(1) = cmnt
myDataMember(2) = xe
myDataMember(3) = xe
End Sub
End Class
serialize할 때 결과 XML은 다음 코드와 유사합니다.
<MyDataContract xmlns="http://schemas.contoso.com">
<myDataMember myAttribute="myValue">
<!--myComment-->
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
</myDataMember>
</MyDataContract>
데이터 멤버 래퍼 요소 <myDataMember> 에는 특성, 주석 및 두 개의 요소가 포함됩니다. 직렬화된 네 XmlNode 개의 인스턴스입니다.
잘못된 XML이 생성되는 배열 XmlNode 은 serialize할 수 없습니다. 예를 들어 이 시퀀스가 유효한 XML 인스턴스에 해당하지 않으므로 첫 번째 XmlNode 인스턴스가 있고 두 번째 XmlElement 인스턴스가 잘못된 두 XmlAttribute 인스턴스의 배열입니다(특성을 연결할 위치가 없음).
배열 XmlNode의 역직렬화에서 노드가 만들어지고 들어오는 XML의 정보로 채워집니다. 역직렬 변환기에서 유효한 부모가 XmlDocument 제공됩니다. 모든 노드는 래퍼 데이터 멤버 요소의 특성을 포함하여 역직렬화되지만 WCF serializer에 의해 배치된 특성(예: 다형 할당을 나타내는 데 사용되는 특성)은 제외됩니다. XML 조각에서 모든 네임스페이스 접두사를 정의해야 한다는 점에 유의하십시오. 이는 XmlNode을 역직렬화하는 것뿐만 아니라 XmlElement 배열을 역직렬화할 때도 마찬가지로 적용됩니다.
개체 그래프 보존 기능이 활성화된 serializer를 사용할 때, 개체 동등성은 개별 XmlNode 인스턴스 수준이 아닌 XmlNode 배열 수준에서만 보존됩니다.
XmlNode 배열에서 하나 이상의 노드가 null으로 설정된 경우 직렬화를 시도하지 마세요. 전체 배열 멤버 null는 허용되지만 배열에 포함된 개인 XmlNode 에는 허용되지 않습니다. 전체 배열 멤버가 null이면 래퍼 데이터 멤버 요소에 null임을 나타내는 특수 특성이 포함됩니다. 역직렬화 시 전체 배열 멤버도 null이 됩니다.
일반 배열 XmlNode 만 직렬 변환기에서 특별히 처리됩니다. 다른 컬렉션 형식으로 선언된 데이터 멤버가 XmlNode을 포함하거나, XmlNode에서 파생된 형식의 데이터 멤버 배열로 선언된 경우, 특별히 처리되지 않습니다. 따라서 직렬화에 대한 다른 기준 중 하나를 충족하지 않는 한 일반적으로 직렬화할 수 없습니다.
배열 또는 배열 컬렉션 XmlNode 이 허용됩니다. 전체 컬렉션에 대한 래퍼 요소와 외부 배열 또는 컬렉션의 각 배열 <myDataMember> 에 대한 별도의 래퍼 요소(이전 예제와 유사XmlNode)가 있습니다.
형식 Array의 Object 또는 Array의 IEnumerable를 XmlNode 인스턴스로 채워도, 해당 데이터 멤버가 Array의 XmlNode 인스턴스로 간주되지는 않습니다. 각 배열 멤버는 별도로 직렬화됩니다.
와 함께 DataContractSerializer사용하면 배열을 XmlNode 다형적으로 할당할 수 있지만 형식 Object의 데이터 멤버에만 할당할 수 있습니다. 구현 IEnumerable하더라도 배열을 XmlNode 컬렉션 형식으로 사용할 수 없으며 데이터 멤버에 IEnumerable 할당할 수 없습니다. 모든 다형 할당과 마찬가지로, 결과 XML에서 데이터 계약 이름을 내보냅니다. 이 경우 네임스페이스DataContractSerializer에 있는 "ArrayOfXmlNode"입니다.
NetDataContractSerializer와 함께 사용할 때 XmlNode 배열에 대한 어떤 할당도 지원됩니다.
스키마 고려 사항
XML 형식의 스키마 매핑에 대한 자세한 내용은 데이터 계약 스키마 참조를 참조하세요. 이 섹션에서는 중요한 사항에 대한 요약을 제공합니다.
형식 XmlElement 의 데이터 멤버는 다음 익명 형식을 사용하여 정의된 요소에 매핑됩니다.
<xsd:complexType>
<xsd:sequence>
<xsd:any minOccurs="0" processContents="lax" />
</xsd:sequence>
</xsd:complexType>
배열 형식의 XmlNode 데이터 멤버는 다음 익명 형식을 사용하여 정의된 요소에 매핑됩니다.
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</xsd:sequence>
<xsd:anyAttribute/>
</xsd:complexType>
IXmlSerializable 인터페이스를 구현하는 형식
인터페이스를 IXmlSerializable 구현하는 형식은 DataContractSerializer에 의해 완전히 지원됩니다.
XmlSchemaProviderAttribute 해당 스키마를 제어하려면 항상 이러한 형식에 특성을 적용해야 합니다.
구현 IXmlSerializable하는 형식에는 임의의 콘텐츠를 나타내는 형식, 단일 요소를 나타내는 형식 및 레거시 형식의 세 가지 종류가 DataSet 있습니다.
콘텐츠 형식은 특성에 지정된 스키마 공급자 메서드를
XmlSchemaProviderAttribute사용합니다. 메서드는null를 반환하지 않으며, 특성의 IsAny 속성은 기본값인false로 남아 있습니다. 'IXmlSerializable형식'의 가장 일반적인 사용 방법입니다.요소 형식은 형식이
IXmlSerializable고유한 루트 요소 이름을 제어해야 하는 경우에 사용됩니다. 형식을 요소 형식으로 표시하려면, IsAny 특성의 XmlSchemaProviderAttribute 속성을true로 설정하거나, 스키마 공급자 메서드에서 null을 반환하십시오. 스키마 공급자 메서드는 요소 형식에 대해 선택 사항입니다. 메서드 이름XmlSchemaProviderAttribute대신 null을 지정할 수 있습니다. 그러나IsAny이/가true인 경우, 스키마 공급자 메서드가 지정되면 그 메서드는 null을 반환해야 합니다.레거시 DataSet 유형은
IXmlSerializable속성으로 표시되지 않는XmlSchemaProviderAttribute유형입니다. 대신 스키마 생성을 위한 메서드를 GetSchema 사용합니다. 이 패턴은DataSet형식에 사용되며, 형식화된 데이터 세트가 이전 버전의 .NET Framework에서는 클래스를 파생시켰습니다. 그러나 지금은 구식으로 여겨지며 레거시 시스템을 지원하기 위해서만 사용됩니다. 이 패턴에 의존하지 말고 항상XmlSchemaProviderAttribute를 귀하의IXmlSerializable형식에 적용하십시오.
IXmlSerializable 콘텐츠 형식
이전에 정의된 대로 IXmlSerializable를 구현하고 콘텐츠 형식인 데이터 멤버를 직렬화할 때, serializer는 데이터 멤버에 대한 래퍼 요소를 작성하고 WriteXml 메서드에 제어를 전달합니다. 구현은 WriteXml 래퍼 요소에 특성을 추가하는 것을 포함하여 XML을 작성할 수 있습니다.
WriteXml 작업이 완료되면 serializer가 요소를 닫습니다.
특정 콘텐츠 형식으로 정의된 형식의 데이터 멤버를 역직렬화할 때, 역직렬화기는 데이터 멤버의 래퍼 요소에 XML 판독기를 배치하고 제어를 IXmlSerializable 메서드로 전달합니다. 메서드는 시작 및 끝 태그를 포함하여 전체 요소를 읽어야 합니다.
ReadXml 코드가 요소가 비어 있는 경우를 처리하는지 확인하십시오. 또한, 당신의 ReadXml 구현은 래퍼 요소가 특정한 방식으로 이름이 지어져야 한다는 것에 의존해서는 안 됩니다. 직렬 변환기에 의해 선택된 이름은 다양할 수 있습니다.
예를 들어 형식의 데이터 멤버에 콘텐츠 형식을 다형적으로 할당 IXmlSerializable 할 수 있습니다 Object. 형식 인스턴스가 null일 수도 있습니다. 마지막으로, IXmlSerializable 형식을 사용하면서 개체 그래프 보존을 활성화하고 NetDataContractSerializer와 함께 사용할 수 있습니다. 이러한 모든 기능을 사용하려면 WCF 직렬화기가 특정 특성을 래퍼 요소에 첨부해야 합니다. 이 특성은 XML 스키마 인스턴스 네임스페이스의 "nil" 및 "type" 그리고 WCF 전용 네임스페이스의 "Id", "Ref", "Type", "Assembly"입니다.
ReadXml을 구현할 때 무시할 특성
코드에 ReadXml 컨트롤을 전달하기 전에 디시리얼라이저는 XML 요소를 검사하여 이러한 특수 XML 특성을 검색하고, 해당 특성에 대해 처리합니다. 예를 들어 "nil" true이면 null 값이 역직렬화되고 ReadXml 호출되지 않습니다. 다형성이 감지되면 요소의 내용이 다른 형식인 것처럼 역직렬화됩니다. 다형적으로 할당된 형식의 구현 ReadXml 이 호출됩니다. 어떤 경우든 구현은 ReadXml 역직렬 변환기에 의해 처리되므로 이러한 특수 특성을 무시해야 합니다.
IXmlSerializable 콘텐츠 형식에 대한 스키마 고려 사항
콘텐츠 형식의 스키마를 IXmlSerializable 내보낼 때 스키마 공급자 메서드가 호출됩니다. 스키마 공급자 메서드에 XmlSchemaSet가 전달됩니다. 메서드는 스키마 집합에 유효한 스키마를 추가할 수 있습니다. 스키마 집합에는 스키마 내보내기가 발생할 때 이미 알려진 스키마가 포함됩니다. 스키마 공급자 메서드가 스키마 집합에 항목을 추가해야 하는 경우 해당 네임스페이스가 있는 항목이 집합에 이미 있는지 XmlSchema 확인해야 합니다. 이 경우 스키마 공급자 메서드는 새 항목을 기존 XmlSchema항목에 추가해야 합니다. 그렇지 않으면 새 XmlSchema 인스턴스를 만들어야 합니다. 이는 형식 배열 IXmlSerializable 을 사용하는 경우에 중요합니다. 예를 들어 네임스페이스 "B"에서 "A" 형식으로 내보내지는 형식이 있는 경우 IXmlSerializable 스키마 공급자 메서드가 호출될 때까지 스키마 집합에 "ArrayOfA" 형식을 보유할 "B"에 대한 스키마가 이미 포함되어 있을 수 있습니다.
형식을 XmlSchemaSet추가하는 것 외에도 콘텐츠 형식에 대한 스키마 공급자 메서드는 null이 아닌 값을 반환해야 합니다.
XmlQualifiedName 형식을 사용할 때 사용할 스키마 형식 이름을 지정하는 IXmlSerializable을(를) 반환할 수 있습니다. 이 정규화된 이름은 형식의 데이터 계약 이름 및 네임스페이스로도 사용됩니다. 스키마 공급자 메서드가 반환될 때 스키마 집합에 없는 형식을 즉시 반환할 수 있습니다. 그러나 모든 관련 형식을 내보낼 때까지(Export메서드가 모든 관련 형식에 대해 호출되고 XsdDataContractExporter 속성에 Schemas 액세스됨) 스키마 집합에 형식이 존재할 것으로 예상됩니다. 모든 관련 Schemas 호출이 이루어지기 전에 Export 속성에 액세스하면 XmlSchemaException이 발생할 수 있습니다. 내보내기 프로세스에 대한 자세한 내용은 클래스에서 스키마 내보내기를 참조하세요.
스키마 제공자 메서드는 사용할 XmlSchemaType를 반환할 수도 있습니다. 형식은 익명일 수도 있고, 익명에 해당하지 않을 수도 있습니다. 익명인 경우, IXmlSerializable 유형이 데이터 멤버로 사용될 때마다 IXmlSerializable 유형의 스키마가 익명 유형으로 내보내집니다. 형식에는 IXmlSerializable 여전히 데이터 계약 이름과 네임스페이스가 있습니다. (이 특성은 이름을 사용자 지정하는 데 사용할 수 없다는 점을 제외하고 DataContractAttribute에 설명된 대로 결정됩니다.) 익명이 아니면 .의 형식 XmlSchemaSet중 하나여야 합니다. 이 경우는 형식의 XmlQualifiedName을 반환하는 것과 같습니다.
또한 형식에 대해 전역 요소 선언을 내보냅니다. 형식에 XmlRootAttribute 특성이 적용되지 않은 경우, 요소의 이름과 네임스페이스는 데이터 계약과 동일하며, 해당 "nillable" 속성은 true입니다. 유일한 예외는 스키마 네임스페이스입니다.http://www.w3.org/2001/XMLSchema 형식의 데이터 계약이 이 네임스페이스에 있는 경우 스키마 네임스페이스에 새 요소를 추가할 수 없으므로 해당 전역 요소가 빈 네임스페이스에 있습니다. 형식에 XmlRootAttribute 특성이 적용된 경우, 전역 요소 선언은 다음 속성 ElementName, Namespace, 및 IsNullable을 사용하여 내보냅니다. 적용된 XmlRootAttribute 기본값은 데이터 계약 이름, 빈 네임스페이스 및 true인 "nillable"입니다.
동일한 전역 요소 선언 규칙이 레거시 데이터 세트 형식에 적용됩니다.
XmlRootAttribute는 스키마 공급자 메서드를 사용하여 XmlSchemaSet에 추가되거나, GetSchema 레거시 데이터 세트 형식에 대해 사용자 지정 코드를 통해 추가된 전역 요소 선언을 재정의할 수 없습니다.
IXmlSerializable 요소 형식
IXmlSerializable 요소 형식에는 속성이 IsAny로 설정되거나, 스키마 공급자 메서드가 true를 반환하는 경우가 있습니다.
요소 형식을 직렬화 및 역직렬화하는 것은 콘텐츠 형식을 직렬화 및 역직렬화하는 것과 매우 유사합니다. 그러나 몇 가지 중요한 차이점이 있습니다.
WriteXml구현은 정확히 하나의 요소(물론 여러 자식 요소를 포함할 수 있음)를 구현해야 합니다. 이 단일 요소, 여러 형제 요소 또는 혼합 콘텐츠 외부에서 특성을 작성해서는 안 됩니다. 요소가 비어 있을 수 있습니다.ReadXml구현체는 래퍼 요소를 읽지 않아야 합니다. 하나의 요소를WriteXml가 생성한 것으로 읽는 것이 기대됩니다.요소 형식을 정기적으로 직렬화할 때(예: 데이터 계약의 데이터 멤버) serializer는 콘텐츠 형식과 마찬가지로 호출
WriteXml하기 전에 래퍼 요소를 출력합니다. 그러나 최상위 수준에서 요소 유형을 직렬화할 때, 직렬 변환기는WriteXml쓰기 요소 주위에 래퍼 요소를 출력하지 않습니다. 이는DataContractSerializer또는NetDataContractSerializer생성자에서 직렬 변환기를 생성할 때 루트 이름 및 네임스페이스를 명시적으로 지정하지 않은 경우에 해당됩니다. 자세한 내용은 직렬화 및 역직렬화를 참조하세요.최상위 수준에서 요소 유형을 serialize할 때, 생성 시 루트 이름 및 네임스페이스를 지정하지 않으면, WriteStartObject와 WriteEndObject은 사실상 아무 작업도 수행하지 않으며, WriteObjectContent는
WriteXml를 호출합니다. 이 모드에서 serialize되는 개체는 null일 수 없으며 다형적으로 할당할 수 없습니다. 또한 개체 그래프 보존은 활성화할 수 없으며NetDataContractSerializer는 사용할 수 없습니다.생성 시 IsStartObject 루트 이름과 네임스페이스를 지정하지 않고 최상위 수준에서 요소 형식을 역직렬화하는 경우 요소의 시작을 찾을 수 있는지 반환
true합니다. ReadObject는verifyObjectName로 설정된true매개 변수를 사용하여 실질적으로 개체를 읽기 전에IsStartObject와 동일한 방식으로 동작합니다.ReadObject그런 다음 메서드에 컨트롤을ReadXml전달합니다.
요소 형식에 대해 내보낸 스키마는 이전 섹션에서 설명한 XmlElement 형식과 동일하지만, 스키마 공급자 메서드가 콘텐츠 형식처럼 XmlSchemaSet에 추가적인 스키마를 더할 수 있다는 점이 다릅니다. 요소 형식에 XmlRootAttribute 특성을 사용할 수 없으며 이러한 형식에 대해 전역 요소 선언은 내보내지지 않습니다.
XmlSerializer와 차이점
IXmlSerializable은 XmlSchemaProviderAttribute 인터페이스 및 XmlRootAttribute와 XmlSerializer 특성을 이해합니다. 그러나 데이터 계약 모델에서 이러한 항목이 처리되는 방식에는 몇 가지 차이점이 있습니다. 중요한 차이점은 다음과 같습니다.
스키마 공급자 메서드는 `
XmlSerializer`에서 사용 가능하도록 공용이어야 하지만, 데이터 계약 모델에서는 공용일 필요가 없습니다.스키마 공급자 메서드는 데이터 계약 모델에서
IsAny가 true인 경우 호출되지만XmlSerializer은 아닙니다.콘텐츠 또는 레거시 데이터 세트 형식에 대해
XmlRootAttribute특성이 없으면,XmlSerializer가 빈 네임스페이스에서 전역 요소 선언을 내보냅니다. 데이터 계약 모델에서 사용되는 네임스페이스는 일반적으로 앞에서 설명한 대로 데이터 계약 네임스페이스입니다.
두 serialization 기술에 모두 사용되는 형식을 만들 때는 이러한 차이점에 유의하세요.
IXmlSerializable 스키마 가져오기
형식의 IXmlSerializable로 생성된 스키마를 가져올 때 몇 가지 가능성이 있습니다.
생성된 스키마는 데이터 계약 스키마 참조에 설명된 대로 유효한 데이터 계약 스키마일 수 있습니다. 이 경우 스키마를 평소와 같이 가져올 수 있으며 일반 데이터 계약 형식이 생성됩니다.
생성된 스키마가 유효한 데이터 계약 스키마가 아닐 수 있습니다. 예를 들어 스키마 공급자 메서드는 데이터 계약 모델에서 지원되지 않는 XML 특성을 포함하는 스키마를 생성할 수 있습니다. 이 경우
IXmlSerializable형식으로 스키마를 가져올 수 있습니다. 이 가져오기 모드는 기본적으로 설정되어 있지 않지만 쉽게 사용하도록 설정할 수 있습니다. 예를 들어/importXmlTypes명령줄이 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)로 전환됩니다. 클래스 를 생성하기 위한 스키마 가져오기에 자세히 설명되어 있습니다. 형식 인스턴스에 대한 XML로 직접 작업해야 합니다. 더 넓은 범위의 스키마를 지원하는 다른 직렬화 기술을 사용하는 것도 고려할 수 있습니다. 사용XmlSerializer방법에 대한 항목을 참조하세요.새 형식을 생성하는 대신 프록시에서 기존
IXmlSerializable형식을 다시 사용할 수 있습니다. 이 경우 형식 생성 항목으로 스키마 가져오기 항목에 설명된 참조된 형식 기능을 사용하여 다시 사용할 형식을 나타낼 수 있습니다. 이것은 다시 사용할 형식을 포함하는 어셈블리를 지정하는 svcutil.exe에서/reference스위치를 사용하는 것과 같습니다.
데이터 계약의 임의 XML 표시
XmlElement, 배열 XmlNode 및 IXmlSerializable 형식을 사용하면 데이터 계약 모델에 임의의 XML을 삽입할 수 있습니다.
DataContractSerializer와 NetDataContractSerializer는 프로세스에 방해하지 않고 이 XML 콘텐츠를 사용 중인 XML 작성기에 전달합니다. 그러나 XML 작성기는 작성하는 XML에 특정 제한을 적용할 수 있습니다. 특히 몇 가지 중요한 예는 다음과 같습니다.
XML 작성기는 일반적으로 다른 문서를 작성하는 동안 XML 문서 선언(예: <?xml version='1.0' ?>)을 허용하지 않습니다. 전체 XML 문서를 가져와서 데이터 멤버로
ArrayXmlNodeserialize할 수 없습니다. 이렇게 하려면 문서 선언을 제거하거나 고유한 인코딩 체계를 사용하여 표시해야 합니다.WCF와 함께 제공되는 모든 XML 작성기는 SOAP 메시지에서 허용되지 않으므로 XML 처리 지침(<? ... ?>) 및 문서 형식 정의(<! ... >)를 거부합니다. 다시 말하지만, 사용자 고유의 인코딩 메커니즘을 사용하여 이 제한을 해결할 수 있습니다. 결과 XML에 포함해야 하는 경우 이를 지원하는 XML 작성기를 사용하는 사용자 지정 인코더를 작성할 수 있습니다.
WriteXml을(를) 구현할 때, XML 작성기에서 WriteRaw 메서드를 호출하지 마세요. WCF는 다양한 XML 인코딩(이진 포함)을 사용하므로 인코딩에서 결과를 사용할 수 있도록 사용하기WriteRaw가 매우 어렵거나 불가능합니다.WriteXml을 구현할 때, WCF와 함께 제공된 XML 작성기에서 지원되지 않는 WriteEntityRef 및 WriteNmToken 메서드를 사용하지 마세요.
DataSet, 형식화된 데이터 세트 및 DataTable 사용
이러한 형식을 사용하는 것은 데이터 계약 모델에서 완전히 지원됩니다. 이러한 형식을 사용하는 경우 다음 사항을 고려합니다.
이러한 형식(특히 DataSet 형식화된 파생 클래스)에 대한 스키마는 일부 비 WCF 플랫폼과 상호 운용할 수 없거나 이러한 플랫폼에서 사용할 때 유용성이 저하될 수 있습니다. 또한
DataSet형식을 사용하면 성능에 영향을 미칠 수 있습니다. 마지막으로, 나중에 애플리케이션의 버전을 지정하는 것이 더 어려워질 수 있습니다. 계약에서DataSet형식 대신 명시적으로 정의된 데이터 계약 형식을 사용하는 것을 고려해 보십시오.DataSet또는DataTable스키마를 가져올 때 이러한 형식을 참조하는 것이 중요합니다. Svcutil.exe 명령줄 도구를 사용하면 System.Data.dll 어셈블리 이름을/reference스위치에 전달하여 이 작업을 수행할 수 있습니다. 형식화된 데이터 세트 스키마를 가져오는 경우 형식화된 데이터 세트의 형식을 참조해야 합니다. Svcutil.exe을 사용하여 형식화된 데이터 세트 어셈블리의 위치를/reference스위치로 전달합니다. 형식 참조에 대한 자세한 내용은 클래스 생성을 위한 스키마 가져오기를 참조하세요.
데이터 계약 모델에서 형식화된 DataSets에 대한 지원은 제한적입니다. 형식화된 DataSets는 직렬화 및 역직렬화할 수 있으며 해당 스키마를 내보낼 수 있습니다. 그러나 데이터 계약 스키마 가져오기는 기존 데이터 세트만 다시 사용할 수 있으므로 스키마에서 새 형식의 DataSet 형식을 생성할 수 없습니다. Svcutil.exe스위치를 사용하여 /r 형식이 지정된 기존 DataSet을 가리킬 수 있습니다. 형식화된 데이터 세트를 사용하는 서비스에서 /r 스위치 없이 Svcutil.exe를 사용하려고 시도하면, 자동으로 대체 직렬화 도구(XmlSerializer)가 선택됩니다. DataContractSerializer를 사용해야 하고 스키마에서 DataSets를 생성해야 하는 경우 다음 절차를 사용할 수 있습니다. 형식화된 데이터 세트 형식을 생성하고(서비스의 스위치와 함께 /d Xsd.exe 도구를 사용하여) 형식을 컴파일한 다음 Svcutil.exe스위치를 사용하여 /r 해당 형식을 가리킵니다.