스키마 가져오기 및 내보내기

WCF(Windows Communication Foundation)에는 새 serialization 엔진인 DataContractSerializer가 포함되어 있습니다. DataContractSerializer는 .NET Framework 개체와 XML을 양방향으로 변환합니다. 직렬 변환기 이외에도, WCF에는 관련 스키마를 가져오고 내보내는 메커니즘이 있습니다. 스키마는 직렬 변환기에서 생성하거나 역직렬 변환기에서 액세스할 수 있는 XML 형태의 설명으로, 시스템에서 인식할 수 있도록 정형화되고 세분화되어 있습니다. WCF에서는 여러 타사 플랫폼과 상호 운용할 수 있는 W3C(World Wide Web 컨소시엄) XSD(XML 스키마 정의 언어)를 스키마 표현으로 사용합니다.

스키마 가져오기 구성 요소인 XsdDataContractImporter는 XSD 스키마 문서를 사용하고 일반적으로 데이터 계약 클래스인 .NET Framework 클래스를 생성하므로, 직렬화된 형태가 해당 스키마에 일치합니다.

예를 들어 다음과 같은 스키마 단편이 있습니다.

XsdDataContractImporter importer = new XsdDataContractImporter();
importer.Options.Namespaces.Add(new KeyValuePair<string, string>("http://schemas.contoso.com/carSchema", "Contoso.Cars"));
Dim importer As New XsdDataContractImporter
importer.Options.Namespaces.Add(New KeyValuePair(Of String, String)("http://schemas.contoso.com/carSchema", "Contoso.Cars"))

코드를 보다 쉽게 파악할 수 있도록 간소화된 다음과 같은 형식을 생성합니다.

[DataContract]
public partial class Vehicle : IExtensibleDataObject
{
    private int yearField;
    private string colorField;

    [DataMember]
    public int year
    {
        get { return this.yearField; }
        set { this.yearField = value; }
    }
    [DataMember]
    public string color
    {
        get { return this.colorField; }
        set { this.colorField = value; }
    }

    private ExtensionDataObject extensionDataField;
    public ExtensionDataObject ExtensionData
    {
        get { return this.extensionDataField; }
        set { this.extensionDataField = value; }
    }
}
Partial Class Vehicle
    Implements IExtensibleDataObject

    Private yearField As Integer
    Private colorField As String

    <DataMember()> _
    Public Property year() As Integer
        Get
            Return Me.yearField
        End Get
        Set
            Me.yearField = value
        End Set
    End Property

    <DataMember()> _
    Public Property color() As String
        Get
            Return Me.colorField
        End Get
        Set
            Me.colorField = value
        End Set
    End Property
    Private extensionDataField As ExtensionDataObject

    Public Property ExtensionData() As ExtensionDataObject _
        Implements IExtensibleDataObject.ExtensionData
        Get
            Return Me.extensionDataField
        End Get
        Set(ByVal value As ExtensionDataObject)
            Me.extensionDataField = value
        End Set
    End Property
End Class

생성된 형식은 다음과 같은 몇 가지 데이터 계약 모범 사례를 따릅니다(모범 사례: 데이터 계약 버전 관리 참조).

  • 이 형식은 IExtensibleDataObject 인터페이스를 구현합니다. 자세한 내용은 호환 가능한 데이터 계약을 참조하세요.

  • 데이터 멤버는 private 필드를 래핑하는 public 속성으로 구현됩니다.

  • 클래스는 부분 클래스로, 생성된 코드를 수정하지 않고 추가 클래스를 만들 수 있습니다.

XsdDataContractExporter를 사용하면 반대로 작업할 수 있습니다. 즉 DataContractSerializer로 serialize할 수 있는 형식을 사용하고 XSD 스키마 문서를 생성할 수 있습니다.

정확도는 보장되지 않음

스키마나 형식을 통해 완벽히 정확한 라운드트립을 만든다고 보장할 수 없습니다. (라운드트립이란 클래스 집합을 만들기 위해 스키마를 가져오고 다시 스키마를 만들기 위해 그 결과를 내보내는 것을 의미합니다) 동일한 스키마는 반환되지 않을 수 있습니다. 이 프로세스를 반대로 해도 정확도는 보장되지 않습니다. (형식을 내보내 해당 스키마를 생성한 다음, 형식을 다시 가져옵니다. 동일한 형식이 반환될 가능성은 낮습니다.)

지원 형식

데이터 계약 모델은 WC3 스키마의 제한된 하위 집합만 지원합니다. 이 하위 집합을 따르지 않는 스키마는 가져오기 프로세스 동안 예외를 발생시킵니다. 예를 들어 데이터 계약의 데이터 멤버가 XML 특성으로 serialize되도록 지정하는 방법이 없다고 가정합니다. 이 경우, XML 특성을 사용하도록 하는 스키마는 지원되지 않고, 올바른 XML 프로젝션으로 데이터 계약을 생성할 수 없으므로 가져오기 작업 동안 예외가 발생됩니다.

예를 들어 다음과 같은 스키마 단편은 가져오기 기본 설정을 사용하여 가져올 수 없습니다.

<xs:complexType name="Vehicle">
  <xs:sequence>
    <xs:element name="year" type="xs:int" />
    <xs:element name="color" type="xs:string" />
  </xs:sequence>
  <xs:attribute name="engineHorsePower" type="xs:int" />
</xs:complexType>

자세한 내용은 데이터 계약 스키마 참조를 참조하세요. 스키마가 데이터 계약 규칙을 따르지 않으면 다른 serialization 엔진을 사용합니다. 예를 들어 XmlSerializer는 별도의 자체 스키마 가져오기 메커니즘을 사용합니다. 또한 지원되는 스키마 범위가 확장되는 특별한 가져오기 모드도 있습니다. 자세한 내용은 스키마를 가져와 클래스 생성에서 IXmlSerializable 형식 생성에 관한 섹션을 참조하세요.

XsdDataContractExporterDataContractSerializer로 직렬화할 수 있는 모든 .NET Framework 형식을 지원합니다. 자세한 내용은 데이터 계약 직렬 변환기에서 지원하는 형식을 참조하세요. XsdDataContractExporter를 사용하여 스키마를 생성하지 않는 이상, XsdDataContractImporter를 통해 생성된 스키마는 일반적으로 XmlSchemaProviderAttribute가 사용할 수 있는 유효한 데이터가 됩니다.

XsdDataContractImporter 사용 방법에 대한 자세한 내용은 클래스 생성을 위한 스키마 가져오기를 참조하세요.

XsdDataContractExporter 사용 방법에 대한 자세한 내용은 클래스에서 스키마 내보내기를 참조하세요.

참고 항목