Bagikan melalui


Impor dan Ekspor Skema

Windows Communication Foundation (WCF) mencakup mesin serialisasi baru, yakni DataContractSerializer. DataContractSerializer menerjemahkan antara objek .NET Framework dan XML (dalam dua arah). Selain alat serialisasi itu sendiri, WCF mencakup mekanisme impor skema dan ekspor skema terkait. Skema adalah deskripsi formal, akurat, dan dapat dibaca mesin dalam bentuk XML yang dihasilkan alat serialisasi atau yang dapat diakses oleh alat deserialisasi. WCF menggunakan Skema XML W3C sebagai representasi skemanya, yang dapat dioperasikan secara luas dengan banyak platform pihak ketiga.

Komponen impor skema, XsdDataContractImporter, mengambil dokumen skema XSD dan menghasilkan kelas .NET Framework (biasanya kelas kontrak data) agar formulir yang diserialisasi sesuai dengan skema yang diberikan.

Misalnya, fragmen skema berikut:

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"))

menghasilkan jenis berikut (sedikit disederhanakan agar lebih mudah dibaca).

[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

Perhatikan bahwa jenis yang dihasilkan mengikuti beberapa praktik terbaik kontrak data (dapat ditemukan di Praktik Terbaik: Penerapan Versi Kontrak Data):

  • Jenis ini mengimplementasikan antarmuka IExtensibleDataObject. Untuk informasi selengkapnya, lihat Kontrak Data yang Kompatibel Dengan Penerusan.

  • Anggota data diimplementasikan sebagai properti publik yang membungkus bidang privat.

  • Kelas ini adalah kelas parsial, dan penambahan dapat dilakukan tanpa memodifikasi kode yang dihasilkan.

XsdDataContractExporter memungkinkan Anda melakukan pembalikan—mengambil jenis yang dapat diserialisasikan dengan DataContractSerializer dan menghasilkan dokumen Skema XSD.

Fidelitas Tidak Dijamin

Tidak dijamin bahwa skema atau jenis melakukan perjalanan dua arah dengan fidelitas total. (Perjalanan dua arah berarti mengimpor skema untuk membuat set kelas, dan mengekspor hasilnya untuk membuat skema lagi.) Skema yang sama mungkin tidak dikembalikan. Membalikkan proses juga tidak dijamin untuk mempertahankan fidelitas. (Ekspor jenis untuk menghasilkan skemanya, lalu impor kembali jenisnya. Hampir tidak mungkin untuk mengembalikan jenis yang sama.)

Jenis yang Didukung

Model kontrak data hanya mendukung subset terbatas dari skema WC3. Skema apa pun yang tidak sesuai dengan subset ini akan menyebabkan pengecualian selama proses impor. Misalnya, tidak ada cara untuk menentukan bahwa anggota data dari kontrak data harus diserialisasikan sebagai atribut XML. Dengan demikian, skema yang memerlukan penggunaan atribut XML tidak didukung dan akan menyebabkan pengecualian selama impor, karena tidak mungkin untuk menghasilkan kontrak data dengan proyeksi XML yang benar.

Misalnya, fragmen skema berikut tidak dapat diimpor menggunakan pengaturan impor default.

<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>

Untuk mengetahui informasi selengkapnya, lihat Referensi Skema Kontrak Data. Jika skema tidak sesuai dengan aturan kontrak data, gunakan mesin serialisasi yang berbeda. Misalnya, XmlSerializer menggunakan mekanisme impor skema terpisahnya sendiri. Selain itu, ada mode impor khusus saat rentang skema yang didukung diperluas. Untuk mengetahui informasi selengkapnya, lihat bagian tentang menghasilkan jenis IXmlSerializable dalam Mengimpor Skema untuk Menghasilkan Kelas.

XsdDataContractExporter mendukung jenis .NET Framework apa pun yang dapat diserialisasikan dengan DataContractSerializer. Untuk mengetahui informasi selengkapnya, lihat Jenis yang Didukung oleh Serializer Kontrak Data. Perhatikan bahwa skema yang dihasilkan menggunakan XsdDataContractExporter biasanya adalah data valid yang dapat digunakan XsdDataContractImporter (kecuali XmlSchemaProviderAttribute digunakan untuk menyesuaikan skema).

Untuk mengetahui informasi selengkapnya tentang penggunaan XsdDataContractImporter, lihat Mengimpor Skema untuk Menghasilkan Kelas.

Untuk mengetahui informasi selengkapnya tentang penggunaan XsdDataContractExporter, lihat Mengekspor Skema dari Kelas.

Lihat juga