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.