Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.