Şema İçeri ve Dışarı Aktarma
Windows Communication Foundation (WCF), yeni bir serileştirme altyapısı DataContractSerializeriçerir. , DataContractSerializer
.NET Framework nesneleri ve XML (her iki yönde de) arasında çevrilir. WCF, seri hale getiricinin kendisine ek olarak ilişkili şema içeri aktarma ve şema dışarı aktarma mekanizmalarını içerir. Şema , seri hale getiricinin ürettiği veya seri durumdan çıkarıcının erişebildiği XML şeklinin resmi, hassas ve makine tarafından okunabilir bir açıklamasıdır. WCF, çok sayıda üçüncü taraf platformla birlikte çalışabilen şema gösterimi olarak World Wide Web Consortium (W3C) XML Şema tanım dilini (XSD) kullanır.
Şema içeri aktarma bileşeni, XsdDataContractImporterbir XSD şema belgesi alır ve serileştirilmiş formların verilen şemaya karşılık gelmesi için .NET Framework sınıfları (normalde veri sözleşmesi sınıfları) oluşturur.
Örneğin, aşağıdaki şema parçası:
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"))
aşağıdaki türü oluşturur (daha iyi okunabilirlik için biraz basitleştirilmiştir).
[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
Oluşturulan türün çeşitli veri sözleşmesi en iyi yöntemlerini izlediğini unutmayın (En İyi Yöntemler: Veri Sözleşmesi Sürüm Oluşturma bölümünde bulunur):
türü arabirimini IExtensibleDataObject uygular. Daha fazla bilgi için bkz . İletme Uyumlu Veri Sözleşmeleri.
Veri üyeleri, özel alanları sarmalayan genel özellikler olarak uygulanır.
sınıfı kısmi bir sınıftır ve oluşturulan kod değiştirilmeden eklemeler yapılabilir.
, XsdDataContractExporter tersini yapmanızı sağlar; ile DataContractSerializer
seri hale getirilebilen türleri alır ve bir XSD Şeması belgesi oluşturur.
Aslına Uygunluk Garanti Değildir
Şemanın veya türlerin toplam aslına uygunluk ile gidiş dönüş yaptığı garanti değildir. (Gidiş dönüş, bir sınıf kümesi oluşturmak için şemayı içeri aktarmak ve sonucu dışarı aktararak şemayı yeniden oluşturmak anlamına gelir.) Aynı şema döndürülmeyebilir. İşlemin tersine çevirmenin aslına uygunluğu koruması da garanti değildir. (Şemayı oluşturmak için bir türü dışarı aktarın ve sonra türü geri içeri aktarın. Aynı türün döndürülür olması pek olası değildir.)
Desteklenen Türler
Veri sözleşmesi modeli WC3 şemasının yalnızca sınırlı bir alt kümesini destekler. Bu alt kümeye uymayan tüm şemalar içeri aktarma işlemi sırasında bir özel duruma neden olur. Örneğin, bir veri sözleşmesinin veri üyesinin XML özniteliği olarak seri hale getirileceğini belirtmenin bir yolu yoktur. Bu nedenle, XML özniteliklerinin kullanılmasını gerektiren şemalar desteklenmez ve doğru XML projeksiyonuyla veri sözleşmesi oluşturmak mümkün olmadığından içeri aktarma sırasında özel durumlara neden olur.
Örneğin, aşağıdaki şema parçası varsayılan içeri aktarma ayarları kullanılarak içeri aktarılamaz.
<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>
Daha fazla bilgi için bkz . Veri Sözleşmesi Şema Başvurusu. Bir şema veri sözleşmesi kurallarına uymuyorsa, farklı bir serileştirme altyapısı kullanın. Örneğin, kendi XmlSerializer ayrı şema içeri aktarma mekanizmasını kullanır. Ayrıca, desteklenen şema aralığının genişletildiği özel bir içeri aktarma modu vardır. Daha fazla bilgi için, Sınıfları Oluşturmak için Şemayı İçeri Aktarma bölümündeki türleri oluşturma IXmlSerializable bölümüne bakın.
ile XsdDataContractExporter
DataContractSerializer
seri hale getirilebilen tüm .NET Framework türlerini destekler. Daha fazla bilgi için bkz . Veri Sözleşmesi Seri Hale Getiricisi Tarafından Desteklenen Türler. kullanılarak oluşturulan şemanın XsdDataContractExporter
normalde kullanabileceği geçerli veriler XsdDataContractImporter
olduğunu unutmayın (şemayı özelleştirmek için kullanılmadığı sürece XmlSchemaProviderAttribute ).
kullanma XsdDataContractImporterhakkında daha fazla bilgi için bkz . Sınıf Oluşturmak için Şemayı İçeri Aktarma.
kullanma XsdDataContractExporterhakkında daha fazla bilgi için bkz . Sınıflardan Şemaları Dışarı Aktarma.