Udostępnij za pośrednictwem


Importowanie i eksportowanie schematu

Program Windows Communication Foundation (WCF) zawiera nowy silnik serializacji, DataContractSerializer. DataContractSerializer przekształca obiekty .NET Framework na XML i odwrotnie. Oprócz samego serializatora program WCF obejmuje skojarzone mechanizmy importu schematu i eksportu schematu. Schemat jest formalnym, precyzyjnym i czytelnym dla maszyn opisem struktury XML, który tworzy serializator lub do którego deserializator ma dostęp. WCF używa języka definicji schematu XML (XSD) World Wide Web Consortium (W3C) jako reprezentacji schematu, który jest powszechnie współdziałający z wieloma platformami innych firm.

Składnik importu schematu , XsdDataContractImporterprzyjmuje dokument schematu XSD i generuje klasy programu .NET Framework (zwykle klasy kontraktów danych), tak aby serializowane formularze odpowiadały danym schematowi.

Na przykład następujący fragment schematu:

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

generuje następujący typ (uproszczony nieznacznie w celu uzyskania lepszej czytelności).

[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

Należy pamiętać, że wygenerowany typ jest zgodny z kilkoma najlepszymi rozwiązaniami dotyczącymi kontraktu danych (znaleziono w artykule Najlepsze rozwiązania: Przechowywanie wersji kontraktu danych):

  • Typ implementuje IExtensibleDataObject interfejs. Aby uzyskać więcej informacji, zobacz Forward-Compatible Kontrakty danych.

  • Elementy członkowskie danych są implementowane jako właściwości publiczne, które opakowują pola prywatne.

  • Klasa jest klasą częściową, a dodatki można wprowadzać bez modyfikowania wygenerowanego kodu.

Umożliwia XsdDataContractExporter wykonywanie odwrotności — serializowanie typów za pomocą DataContractSerializer, a także generowanie dokumentu schematu XSD.

Wierność nie jest gwarantowana

Nie ma gwarancji, że schemat lub typy przechodzą pełny cykl z pełną wiernością. (Droga w obie strony oznacza zaimportowanie schematu w celu utworzenia zestawu klas i wyeksportowanie wyniku, aby ponownie utworzyć schemat). Może się zdarzyć, że nie zwróci się ten sam schemat. Odwrócenie procesu nie gwarantuje również zachowania wierności. (Wyeksportuj typ, aby wygenerować jego schemat, a następnie zaimportuj typ z powrotem. Jest mało prawdopodobne, że zwracany jest ten sam typ).

Obsługiwane typy

Model kontraktu danych obsługuje tylko ograniczony podzestaw schematu WC3. Każdy schemat, który nie jest zgodny z tym podzbiorem, spowoduje wyjątek podczas procesu importowania. Na przykład nie ma możliwości ustalenia, że składnik danych w kontrakcie danych powinien być serializowany jako atrybut XML. W związku z tym schematy wymagające użycia atrybutów XML nie są obsługiwane i spowodują wyjątki podczas importowania, ponieważ nie można wygenerować kontraktu danych z prawidłową projekcją XML.

Na przykład nie można zaimportować następującego fragmentu schematu przy użyciu domyślnych ustawień importu.

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

Aby uzyskać więcej informacji, zobacz Dokumentacja schematu kontraktu danych. Jeśli schemat nie jest zgodny z regułami kontraktu danych, użyj innego silnika serializacji. Na przykład XmlSerializer używa własnego oddzielnego mechanizmu importowania schematu. Ponadto istnieje specjalny tryb importowania, w którym rozszerzono zakres obsługiwanych schematów. Aby uzyskać więcej informacji, zobacz sekcję dotyczącą generowania IXmlSerializable typów w temacie Importowanie schematu do generowania klas.

Program XsdDataContractExporter obsługuje dowolne typy programu .NET Framework, które można serializować za pomocą elementu DataContractSerializer. Aby uzyskać więcej informacji, zobacz Typy obsługiwane przez serializator kontraktu danych. Należy pamiętać, że schemat wygenerowany przy użyciu elementu XsdDataContractExporter jest zwykle prawidłowymi danymi, których XsdDataContractImporter można użyć (chyba że XmlSchemaProviderAttribute jest używany do dostosowywania schematu).

Aby uzyskać więcej informacji na temat korzystania z XsdDataContractImporter, zobacz Importowanie schematu do generowania klas.

Aby uzyskać więcej informacji na temat korzystania z programu XsdDataContractExporter, zobacz Eksportowanie schematów z klas.

Zobacz także