Importowanie i eksportowanie schematu

Program Windows Communication Foundation (WCF) zawiera nowy aparat serializacji, czyli DataContractSerializer. Tłumaczy DataContractSerializer między obiektami .NET Framework i XML (w obu kierunkach). Oprócz samego serializatora program WCF obejmuje skojarzone mechanizmy importu schematu i eksportu schematu. Schemat jest formalnym, precyzyjnym i czytelnym dla maszyn opisem kształtu XML, który tworzy serializator lub czy deserializator może uzyskać 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 Kontrakty danych zgodne z przekazywaniem.

  • 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 to wykonywanie odwrotnych czynności — typy, które można serializować za pomocą DataContractSerializer dokumentu i generują dokument schematu XSD.

Wierność nie jest gwarantowana

Nie ma gwarancji, że schemat lub typy robią rundę z całkowitą wiernością. (Zaokrąglenie oznacza zaimportowanie schematu w celu utworzenia zestawu klas i wyeksportowanie wyniku w celu ponownego utworzenia schematu). Nie można zwrócić tego samego schematu. 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 określenia, że element członkowski danych kontraktu 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 aparatu serializacji. Na przykład program używa własnego oddzielnego mechanizmu importowania XmlSerializer 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 programu , zobacz Importowanie schematu XsdDataContractImporterdo generowania klas.

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

Zobacz też