Share via


Seri Hale Getirme ve Seri Durumdan Çıkarma

Windows Communication Foundation (WCF), yeni bir serileştirme altyapısı DataContractSerializeriçerir. . DataContractSerializer .NET Framework nesneleri ve XML arasında her iki yönde de çeviriler. Bu konuda seri hale getiricinin nasıl çalıştığı açıklanmaktadır.

.NET Framework nesnelerini seri hale getirirken seri hale getirici, yeni veri sözleşmesi modeli de dahil olmak üzere çeşitli serileştirme programlama modellerini anlar. Desteklenen türlerin tam listesi için bkz . Veri Sözleşmesi Seri Hale Getiricisi Tarafından Desteklenen Türler. Veri sözleşmelerine giriş için bkz . Veri Sözleşmelerini Kullanma.

XML seri durumdan çıkarılırken seri hale getirici ve XmlWriter sınıflarını XmlReader kullanır. Ayrıca, WCF ikili XML biçimini kullanırken olduğu gibi bazı durumlarda en iyi duruma getirilmiş XML üretmesini sağlamak için ve XmlDictionaryWriter sınıflarını desteklerXmlDictionaryReader.

WCF ayrıca yardımcı bir seri hale getirici de NetDataContractSerializeriçerir: . NetDataContractSerializer:

  • Güvenli değil . Daha fazla bilgi için bkz . BinaryFormatter güvenlik kılavuzu.
  • ve SoapFormatter seri hale getiricilerine benzer BinaryFormatter çünkü serileştirilmiş verilerin bir parçası olarak .NET Framework tür adlarını da yayar.
  • Serileştirmede aynı türler paylaşıldığında ve seri durumdan çıkarma sona erdiğinde kullanılır.

NetDataContractSerializer Hem hem de DataContractSerializer ortak bir temel sınıfı XmlObjectSerializerolan 'den türetilir.

Uyarı

, 20'nin DataContractSerializer altında bir onaltılık değere sahip denetim karakterleri içeren dizeleri XML varlıkları olarak serileştirir. Bu, bu tür verileri bir WCF hizmetine gönderirken WCF olmayan bir istemciyle ilgili bir soruna neden olabilir.

DataContractSerializer Örneği Oluşturma

örneğini DataContractSerializer oluşturmak önemli bir adımdır. yapımdan sonra, ayarların hiçbirini değiştiremezsiniz.

Kök Türünü Belirtme

Kök türü, örneklerin seri hale getirildiği veya seri durumdan çıkarıldığı türdür. DataContractSerializer birçok oluşturucu aşırı yüklemesine sahiptir, ancak en azından parametresi kullanılarak type bir kök türü sağlanmalıdır.

Belirli bir kök türü için oluşturulan seri hale getirici, kök türünden türetilmediği sürece başka bir türü seri hale getirmek (veya seri durumdan çıkarmak) için kullanılamaz. Aşağıdaki örnekte iki sınıf gösterilmektedir.

[DataContract]
public class Person
{
    // Code not shown.
}

[DataContract]
public class PurchaseOrder
{
    // Code not shown.
}
<DataContract()> _
Public Class Person
    ' Code not shown.
End Class

<DataContract()> _
Public Class PurchaseOrder
    ' Code not shown.
End Class

Bu kod yalnızca sınıfının örneklerini serileştirmek veya seri durumdan çıkarmak için kullanılabilecek bir örneğini DataContractSerializerPerson oluşturur.

DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
// This can now be used to serialize/deserialize Person but not PurchaseOrder.
Dim dcs As New DataContractSerializer(GetType(Person))
' This can now be used to serialize/deserialize Person but not PurchaseOrder.

Bilinen Türleri Belirtme

Özniteliği veya başka bir mekanizma kullanılarak KnownTypeAttribute işlenmeyen serileştirilmiş türlerde polimorfizm varsa, olası bilinen türlerin listesi seri hale getiricinin oluşturucusunun knownTypes parametresi kullanılarak geçirilmelidir. Bilinen türler hakkında daha fazla bilgi için bkz . Veri Sözleşmesi Bilinen Türleri.

Aşağıdaki örnekte, LibraryPatronbelirli bir türdeki koleksiyonu içeren bir sınıfı gösterilmektedir LibraryItem. İkinci sınıf türü tanımlar LibraryItem . Üçüncü ve dört sınıf (Book ve Newspaper) sınıfından devralır LibraryItem .

[DataContract]
public class LibraryPatron
{
    [DataMember]
    public LibraryItem[] borrowedItems;
}
[DataContract]
public class LibraryItem
{
    // Code not shown.
}

[DataContract]
public class Book : LibraryItem
{
    // Code not shown.
}

[DataContract]
public class Newspaper : LibraryItem
{
    // Code not shown.
}
<DataContract()> _
Public Class LibraryPatron
    <DataMember()> _
    Public borrowedItems() As LibraryItem
End Class

<DataContract()> _
Public Class LibraryItem
    ' Code not shown.
End Class

<DataContract()> _
Public Class Book
    Inherits LibraryItem
    ' Code not shown.
End Class

<DataContract()> _
Public Class Newspaper
    Inherits LibraryItem
    ' Code not shown.
End Class

Aşağıdaki kod, parametresini kullanarak seri hale getiricinin bir örneğini knownTypes oluşturur.

// Create a serializer for the inherited types using the knownType parameter.
Type[] knownTypes = new Type[] { typeof(Book), typeof(Newspaper) };
DataContractSerializer dcs =
new DataContractSerializer(typeof(LibraryPatron), knownTypes);
// All types are known after construction.
' Create a serializer for the inherited types using the knownType parameter.
Dim knownTypes() As Type = {GetType(Book), GetType(Newspaper)}
Dim dcs As New DataContractSerializer(GetType(LibraryPatron), knownTypes)
' All types are known after construction.

Varsayılan Kök Adı ve Ad Alanını Belirtme

Normalde, bir nesne seri hale getirildiğinde, en dıştaki XML öğesinin varsayılan adı ve ad alanı, veri sözleşmesi adına ve ad alanına göre belirlenir. Tüm iç öğelerin adları veri üyesi adlarından belirlenir ve bunların ad alanı veri sözleşmesinin ad alanıdır. Aşağıdaki örnek, ve sınıflarının DataContractAttribute oluşturucularında ve DataMemberAttribute değerlerini ayarlarName.Namespace

[DataContract(Name = "PersonContract", Namespace = "http://schemas.contoso.com")]
public class Person2
{
    [DataMember(Name = "AddressMember")]
    public Address theAddress;
}

[DataContract(Name = "AddressContract", Namespace = "http://schemas.contoso.com")]
public class Address
{
    [DataMember(Name = "StreetMember")]
    public string street;
}
<DataContract(Name:="PersonContract", [Namespace]:="http://schemas.contoso.com")> _
Public Class Person2
    <DataMember(Name:="AddressMember")> _
    Public theAddress As Address
End Class

<DataContract(Name:="AddressContract", [Namespace]:="http://schemas.contoso.com")> _
Public Class Address
    <DataMember(Name:="StreetMember")> _
    Public street As String
End Class

Sınıfın bir örneğini Person seri hale getirmek, aşağıdakine benzer bir XML üretir.

<PersonContract xmlns="http://schemas.contoso.com">  
  <AddressMember>  
    <StreetMember>123 Main Street</StreetMember>  
   </AddressMember>  
</PersonContract>  

Ancak, ve parametrelerinin DataContractSerializer değerlerini rootName oluşturucuya geçirerek kök öğenin varsayılan adını ve rootNamespace ad alanını özelleştirebilirsiniz. öğesinin rootNamespace , veri üyelerine karşılık gelen kapsanan öğelerin ad alanını etkilemediğini unutmayın. Yalnızca en dıştaki öğenin ad alanını etkiler.

Bu değerler, ikili XML biçimini kullanarak iyileştirmelerine izin vermek için sınıfın XmlDictionaryString dizeleri veya örnekleri olarak geçirilebilir.

En Fazla Nesne Kotasını Ayarlama

Bazı DataContractSerializer oluşturucu aşırı yüklemelerinin bir maxItemsInObjectGraph parametresi vardır. Bu parametre, seri hale getiricinin tek ReadObject bir yöntem çağrısında seri hale getireceği veya seri durumdan çıkardığını en fazla nesne sayısını belirler. (yöntemi her zaman bir kök nesneyi okur, ancak bu nesnenin veri üyelerinde başka nesneler olabilir. Bu nesneler başka nesnelere sahip olabilir ve bu şekilde devam edebilir.) Varsayılan değer 65536'dır. Dizileri seri hale getirirken veya seri durumdan çıkarırken her dizi girişinin ayrı bir nesne olarak sayıldığını unutmayın. Ayrıca, bazı nesnelerin büyük bir bellek gösterimine sahip olabileceğini ve bu nedenle yalnızca bu kotanın hizmet reddi saldırısını önlemek için yeterli olmayabileceğini unutmayın. Daha fazla bilgi için bkz . Veriler için GüvenlikLe İlgili Önemli Noktalar. Bu kotayı varsayılan değerin ötesinde artırmanız gerekiyorsa, hem veri okurken hem de yazarken geçerli olduğundan, hem gönderme (serileştirme) hem de alma (seri durumdan çıkarma) taraflarında bunu yapmanız önemlidir.

Gidiş Dönüş

Bir nesne seri durumdan çıkarıldığında ve tek bir işlemde yeniden seri hale getirildiğinde gidiş dönüş gerçekleşir. Bu nedenle, XML'den bir nesne örneğine ve yeniden xml akışına gider.

Bazı DataContractSerializer oluşturucu aşırı yüklemeleri varsayılan olarak olarak ayarlanmış bir ignoreExtensionDataObject parametreye false sahiptir. Bu varsayılan modda veriler, veri sözleşmesi arabirimini uyguladığı sürece daha eski bir sürüm aracılığıyla veri sözleşmesinin daha yeni bir sürümünden gidiş dönüşte ve kayıpsız olarak daha yeni sürüme IExtensibleDataObject geri gönderilebilir. Örneğin, veri sözleşmesinin Person 1. sürümünün ve PhoneNumber veri üyelerini içerdiğini Name ve sürüm 2'nin bir Nickname üye ekley dediğini varsayalım. Uygulanırsa IExtensibleDataObject , sürüm 2'den sürüm 1'e Nickname bilgi gönderirken veriler depolanır ve veriler yeniden seri hale getirildiğinde yeniden yayılır; bu nedenle gidiş dönüşte hiçbir veri kaybolmaz. Daha fazla bilgi için bkz . İletme Uyumlu Veri Sözleşmeleri ve Veri Sözleşmesi Sürümü Oluşturma.

Gidiş Dönüşlerle ilgili Güvenlik ve Şema Geçerlilik Endişeleri

Gidiş dönüşlerin güvenlik açısından etkileri olabilir. Örneğin, büyük miktarlardaki fazlalık verileri seri durumdan çıkarma ve depolama güvenlik riski olabilir. Bu verileri yeniden yayma konusunda, özellikle dijital imzalar söz konusu olduğunda doğrulamanın hiçbir yolu olmadığına ilişkin güvenlik endişeleri olabilir. Örneğin, önceki senaryoda sürüm 1 uç noktası kötü amaçlı veriler içeren bir Nickname değer imzalayabilir. Son olarak, şema geçerlilik sorunları olabilir: Uç nokta her zaman belirtilen sözleşmeye kesinlikle bağlı olan ve ek değerlere uymayan veriler yaymak isteyebilir. Önceki örnekte, sürüm 1 uç noktasının sözleşmesi yalnızca Name ve PhoneNumberyayılımını söylüyor ve şema doğrulaması kullanılıyorsa fazladan Nickname değer yaymak doğrulamanın başarısız olmasına neden oluyor.

Gidiş Dönüşleri Etkinleştirme ve Devre Dışı Bırakma

Gidiş dönüşleri kapatmak için arabirimi uygulamayın IExtensibleDataObject . Türler üzerinde denetiminiz yoksa, aynı etkiyi ignoreExtensionDataObject elde etmek için parametresini olarak true ayarlayın.

Nesne Grafı Koruma

Normalde seri hale getirici, aşağıdaki kodda olduğu gibi nesne kimliğiyle ilgilenmez.

[DataContract]
public class PurchaseOrder
{
    [DataMember]
    public Address billTo;
    [DataMember]
    public Address shipTo;
}

[DataContract]
public class Address
{
    [DataMember]
    public string street;
}
<DataContract()> _
Public Class PurchaseOrder

    <DataMember()> _
    Public billTo As Address

    <DataMember()> _
    Public shipTo As Address

End Class

<DataContract()> _
Public Class Address

    <DataMember()> _
    Public street As String

End Class

Aşağıdaki kod bir satınalma siparişi oluşturur.

// Construct a purchase order:
Address adr = new Address();
adr.street = "123 Main St.";
PurchaseOrder po = new PurchaseOrder();
po.billTo = adr;
po.shipTo = adr;
' Construct a purchase order:
Dim adr As New Address()
adr.street = "123 Main St."
Dim po As New PurchaseOrder()
po.billTo = adr
po.shipTo = adr

ve shipTo alanlarının billTo aynı nesne örneğine ayarlandığına dikkat edin. Ancak, oluşturulan XML yinelenen bilgileri yineler ve aşağıdaki XML'ye benzer.

<PurchaseOrder>  
  <billTo><street>123 Main St.</street></billTo>  
  <shipTo><street>123 Main St.</street></shipTo>  
</PurchaseOrder>  

Ancak, bu yaklaşım istenmeyen olabilecek aşağıdaki özelliklere sahiptir:

  • Performans. Verilerin çoğaltılması verimsizdir.

  • Döngüsel başvurular. Nesneler kendilerine başvuruda bulunursa, diğer nesneler aracılığıyla bile çoğaltmayla seri hale getirilerek sonsuz bir döngüye neden olur. (Seri hale getirici böyle bir durumda bir SerializationException atar.)

  • Semantiği. Bazen iki başvurunun aynı nesneye olduğu ve iki özdeş nesneye değil, aynı nesneye ait olduğu gerçeğini korumak önemlidir.

Bu nedenlerden dolayı, bazı DataContractSerializer oluşturucu aşırı yüklemelerinin bir preserveObjectReferences parametresi vardır (varsayılan değerdir false). Bu parametre olarak trueayarlandığında, yalnızca WCF'nin anladığı özel bir kodlama nesnesi başvurusu yöntemi kullanılır. olarak trueayarlandığında, XML kodu örneği artık aşağıdakine benzer.

<PurchaseOrder ser:id="1">  
  <billTo ser:id="2"><street ser:id="3">123 Main St.</street></billTo>  
  <shipTo ser:ref="2"/>  
</PurchaseOrder>  

"ser" ad alanı, standart serileştirme ad alanını ifade http://schemas.microsoft.com/2003/10/Serialization/eder. Her veri parçası yalnızca bir kez serileştirilir ve bir kimlik numarası verilir ve sonraki kullanımlar zaten serileştirilmiş verilere başvuruyla sonuçlanır.

Önemli

Veri sözleşmesinde XMLElementhem "id" hem de "ref" öznitelikleri varsa, "ref" özniteliği kabul edilir ve "id" özniteliği yoksayılır.

Bu modun sınırlamalarını anlamak önemlidir:

  • ile üretilen XMLDataContractSerializer, başka true hiçbir teknolojiyle preserveObjectReferences birlikte çalışamaz ve yalnızca başka bir DataContractSerializer örnek tarafından ve olarak preserveObjectReferences ayarlanmış trueolarak erişilebilir.

  • Bu özellik için meta veri (şema) desteği yoktur. Oluşturulan şema yalnızca olarak ayarlandığında falsedurum preserveObjectReferences için geçerlidir.

  • Bu özellik serileştirme ve seri durumdan çıkarma işleminin daha yavaş çalışmasına neden olabilir. Verilerin çoğaltılması gerekmese de, bu modda ek nesne karşılaştırmaları gerçekleştirilmelidir.

Dikkat

preserveObjectReferences Mod etkinleştirildiğinde, değeri doğru kotaya ayarlamak maxItemsInObjectGraph özellikle önemlidir. Dizilerin bu modda işlenme şekli nedeniyle, bir saldırganın yalnızca kotayla sınırlı büyük bellek tüketimine neden olan küçük bir kötü amaçlı ileti oluşturması maxItemsInObjectGraph kolaydır.

Veri Sözleşmesi Vekili Belirtme

Bazı DataContractSerializer oluşturucu aşırı yüklemeleri, olarak ayarlanabilen bir dataContractSurrogate parametreye nullsahiptir. Aksi takdirde, arabirimi uygulayan IDataContractSurrogate bir tür olan bir veri sözleşmesi vekili belirtmek için bunu kullanabilirsiniz. Ardından serileştirme ve seri durumdan çıkarma işlemini özelleştirmek için arabirimini kullanabilirsiniz. Daha fazla bilgi için bkz . Veri Sözleşmesi Vekilleri.

Serileştirme

Aşağıdaki bilgiler, ve NetDataContractSerializer sınıfları da dahil olmak üzere DataContractSerializer öğesinden XmlObjectSerializerdevralan tüm sınıflar için geçerlidir.

Basit Serileştirme

Bir nesneyi seri hale getirmenin en temel yolu, bunu yöntemine WriteObject geçirmektir. Her biri bir , XmlWriterveya XmlDictionaryWriteröğesine yazmak için birer tane olmak üzere Streamüç aşırı yükleme vardır. Aşırı yüklemeyle Stream , çıkış UTF-8 kodlamasında XML olur. XmlDictionaryWriter Aşırı yükleme ile seri hale getirici, ikili XML için çıkışını iyileştirir.

yöntemini kullanırken WriteObject , seri hale getirici sarmalayıcı öğesi için varsayılan adı ve ad alanını kullanır ve içeriğiyle birlikte yazar (önceki "Varsayılan Kök Adı ve Ad Alanını Belirtme" bölümüne bakın).

Aşağıdaki örnekte ile XmlDictionaryWriteryazma gösterilmektedir.

Person p = new Person();
DataContractSerializer dcs =
    new DataContractSerializer(typeof(Person));
XmlDictionaryWriter xdw =
    XmlDictionaryWriter.CreateTextWriter(someStream,Encoding.UTF8 );
dcs.WriteObject(xdw, p);
Dim p As New Person()
Dim dcs As New DataContractSerializer(GetType(Person))
Dim xdw As XmlDictionaryWriter = _
    XmlDictionaryWriter.CreateTextWriter(someStream, Encoding.UTF8)
dcs.WriteObject(xdw, p)

Bu, aşağıdakine benzer bir XML üretir.

<Person>  
  <Name>Jay Hamlin</Name>  
  <Address>123 Main St.</Address>  
</Person>  

Adım Adım Serileştirme

WriteStartObjectWriteObjectContentBitiş öğesini yazmak, nesne içeriğini yazmak ve sarmalayıcı öğesini kapatmak için , ve WriteEndObject yöntemlerini kullanın.

Not

Bu yöntemlerin aşırı yüklemesi yoktur Stream .

Bu adım adım serileştirmenin iki yaygın kullanımı vardır. Bunlardan biri, aşağıdaki örnekte gösterildiği gibi ve WriteObjectContentarasında WriteStartObject öznitelikler veya açıklamalar gibi içerikler eklemektir.

dcs.WriteStartObject(xdw, p);
xdw.WriteAttributeString("serializedBy", "myCode");
dcs.WriteObjectContent(xdw, p);
dcs.WriteEndObject(xdw);
dcs.WriteStartObject(xdw, p)
xdw.WriteAttributeString("serializedBy", "myCode")
dcs.WriteObjectContent(xdw, p)
dcs.WriteEndObject(xdw)

Bu, aşağıdakine benzer bir XML üretir.

<Person serializedBy="myCode">  
  <Name>Jay Hamlin</Name>  
  <Address>123 Main St.</Address>  
</Person>  

Bir diğer yaygın kullanım, aşağıdaki kodda gösterildiği gibi kullanmaktan ve tamamen kullanmaktan WriteStartObjectWriteEndObject kaçınmak ve kendi özel sarmalayıcı öğenizi yazmaktır (hatta sarmalayıcı yazmayı tamamen atlayabilirsiniz).

xdw.WriteStartElement("MyCustomWrapper");
dcs.WriteObjectContent(xdw, p);
xdw.WriteEndElement();
xdw.WriteStartElement("MyCustomWrapper")
dcs.WriteObjectContent(xdw, p)
xdw.WriteEndElement()

Bu, aşağıdakine benzer bir XML üretir.

<MyCustomWrapper>  
  <Name>Jay Hamlin</Name>  
  <Address>123 Main St.</Address>  
</MyCustomWrapper>  

Not

Adım adım serileştirmenin kullanılması şema geçersiz XML'ye neden olabilir.

Deserialization

Aşağıdaki bilgiler, ve NetDataContractSerializer sınıfları da dahil olmak üzere DataContractSerializer öğesinden XmlObjectSerializerdevralan tüm sınıflar için geçerlidir.

Bir nesneyi seri durumdan çıkarmanın en temel yolu yöntem aşırı yüklemelerinden ReadObject birini çağırmaktır. Her biri , XmlReaderveya ile XmlDictionaryReaderokumak için bir tane olmak Streamüzere üç aşırı yükleme vardır. Aşırı yüklemenin Stream herhangi bir kota tarafından korunmayan bir metinsel XmlDictionaryReader oluşturduğunu ve yalnızca güvenilen verileri okumak için kullanılması gerektiğini unutmayın.

Ayrıca yöntemin döndürdüğü nesnenin ReadObject uygun türe yayınlanması gerektiğini unutmayın.

Aşağıdaki kod bir ve örneğini DataContractSerializer oluşturur ve XmlDictionaryReaderardından bir Person örneği seri durumdan çıkartır.

DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
FileStream fs = new FileStream(path, FileMode.Open);
XmlDictionaryReader reader =
XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());

Person p = (Person)dcs.ReadObject(reader);
Dim dcs As New DataContractSerializer(GetType(Person))
Dim fs As New FileStream(path, FileMode.Open)
Dim reader As XmlDictionaryReader = _
   XmlDictionaryReader.CreateTextReader(fs, New XmlDictionaryReaderQuotas())

Dim p As Person = CType(dcs.ReadObject(reader), Person)

yöntemini çağırmadan ReadObject önce, XML okuyucuyu sarmalayıcı öğesinde veya sarmalayıcı öğesinden önceki içerik olmayan bir düğümde konumlandırın. Bunu yapmak için aşağıdaki kodda gösterildiği gibi veya yöntemini çağırabilir ReadXmlReader ve türünü test NodeTypeedebilirsiniz.

DataContractSerializer ser = new DataContractSerializer(typeof(Person),
"Customer", @"http://www.contoso.com");
FileStream fs = new FileStream(path, FileMode.Open);
XmlDictionaryReader reader =
XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
while (reader.Read())
{
    switch (reader.NodeType)
    {
        case XmlNodeType.Element:
            if (ser.IsStartObject(reader))
            {
                Console.WriteLine("Found the element");
                Person p = (Person)ser.ReadObject(reader);
                Console.WriteLine("{0} {1}    id:{2}",
                    p.Name , p.Address);
            }
            Console.WriteLine(reader.Name);
            break;
    }
}
Dim ser As New DataContractSerializer(GetType(Person), "Customer", "http://www.contoso.com")
Dim fs As New FileStream(path, FileMode.Open)
Dim reader As XmlDictionaryReader = XmlDictionaryReader.CreateTextReader(fs, New XmlDictionaryReaderQuotas())

While reader.Read()
    Select Case reader.NodeType
        Case XmlNodeType.Element
            If ser.IsStartObject(reader) Then
                Console.WriteLine("Found the element")
                Dim p As Person = CType(ser.ReadObject(reader), Person)
                Console.WriteLine("{0} {1}", _
                                   p.Name, p.Address)
            End If
            Console.WriteLine(reader.Name)
    End Select
End While

Okuyucuyu uygulamasına vermeden önce bu sarmalayıcı öğesindeki öznitelikleri okuyabileceğinizi ReadObjectunutmayın.

Seri durumdan çıkarıcı, basit ReadObject aşırı yüklemelerden birini kullanırken sarmalayıcı öğesinde varsayılan adı ve ad alanını arar (yukarıdaki "Varsayılan Kök Adı ve Ad Alanını Belirtme" bölümüne bakın) ve bilinmeyen bir öğe bulursa bir özel durum oluşturur. Yukarıdaki örnekte sarmalayıcı <Person> öğesi beklenmektedir. IsStartObject yöntemi, okuyucunun beklendiği gibi adlandırılmış bir öğeye konumlandırıldığını doğrulamak için çağrılır.

Bu sarmalayıcı öğe adı denetimini devre dışı bırakmanın bir yolu vardır; yönteminin ReadObject bazı aşırı yüklemeleri, varsayılan olarak olarak ayarlanan Boole parametresini verifyObjectNametrue alır. olarak falseayarlandığında, sarmalayıcı öğesinin adı ve ad alanı yoksayılır. Bu, daha önce açıklanan adım adım serileştirme mekanizması kullanılarak yazılan XML'yi okumak için kullanışlıdır.

NetDataContractSerializer'ı kullanma

ile NetDataContractSerializerDataContractSerializer arasındaki DataContractSerializer birincil fark, veri sözleşmesi adlarını kullanırken NetDataContractSerializer çıkışlar serileştirilmiş XML'de tam .NET Framework derlemesi ve tür adları kullanır. Bu, serileştirme ve seri durumdan çıkarma uç noktaları arasında tam olarak aynı türlerin paylaşılması gerektiği anlamına gelir. Bu, seri durumdan çıkarılacak tam türler her zaman bilindiğinden, ile bilinen türler mekanizmasının gerekli NetDataContractSerializer olmadığı anlamına gelir.

Ancak, birkaç sorun oluşabilir:

  • Güvenlik. Seri durumdan çıkarılmakta olan XML'de bulunan herhangi bir tür yüklenir. Bu, kötü amaçlı türlerin yüklenmesini zorlamak için kullanılabilir. NetDataContractSerializer kullanma güvenilmeyen verilerle yalnızca bir Serileştirme Bağlayıcısı kullanılıyorsa (özellik veya oluşturucu parametresi kullanılarakBinder) yapılmalıdır. Bağlayıcı yalnızca güvenli türlerin yüklenmesine izin verir. Bağlayıcı mekanizması, ad alanı kullanımına türleyen mekanizmayla System.Runtime.Serialization aynıdır.

  • Sürüm oluşturma. XML'de tam tür ve derleme adlarının kullanılması türlerin nasıl sürümlenebileceğini ciddi ölçüde kısıtlar. Aşağıdakiler değiştirilemez: tür adları, ad alanları, derleme adları ve derleme sürümleri. özelliğinin veya oluşturucu parametresinin AssemblyFormatSimple varsayılan değeri Full yerine olarak ayarlanması, derleme sürümü değişikliklerine izin verir, ancak genel parametre türleri için izin vermez.

  • Birlikte çalışabilirlik. .NET Framework türü ve derleme adları XML'ye eklendiğinden, .NET Framework dışındaki platformlar sonuçta elde edilen verilere erişemez.

  • Performans. Tür ve derleme adlarının yazılması, sonuçta elde edilen XML'nin boyutunu önemli ölçüde artırır.

Bu mekanizma, .NET Framework uzaktan iletişim (özellikle ve ) tarafından kullanılan ikili veya SOAP serileştirmesine BinaryFormatterSoapFormatterbenzer.

öğesinin NetDataContractSerializer kullanılması DataContractSerializer, aşağıdaki farklarla kullanımına benzer:

  • Oluşturucular bir kök türü belirtmenizi gerektirmez. Herhangi bir türü aynı örneğiyle NetDataContractSerializerseri hale getirebilirsiniz.

  • Oluşturucular bilinen türlerin listesini kabul etmemektedir. Tür adları XML'de serileştirilmişse, bilinen tür mekanizması gereksizdir.

  • Oluşturucular bir veri sözleşmesi vekilini kabul etmemektedir. Bunun yerine adlı surrogateSelector bir ISurrogateSelector parametre kabul eder (özelliğiyle SurrogateSelector eşler). Bu eski bir vekil mekanizmadır.

  • Oluşturucular, özelliğine eşleyen adlı assemblyFormatFormatterAssemblyStyle bir parametreyi kabul eder AssemblyFormat . Daha önce açıklandığı gibi, seri hale getiricinin sürüm oluşturma özelliklerini geliştirmek için bu kullanılabilir. Bu, ikili veya SOAP serileştirmesindeki mekanizmayla aynıdır FormatterAssemblyStyle .

  • Oluşturucular, özelliğiyle eşleyen adlı context bir StreamingContext parametreyi kabul ederContext. Bilgileri seri hale getirilen türlere geçirmek için bunu kullanabilirsiniz. Bu kullanım, diğer System.Runtime.Serialization sınıflarda kullanılan mekanizmayla StreamingContext aynıdır.

  • Serialize ve Deserialize yöntemleri ve ReadObject yöntemleri için WriteObject diğer adlardır. Bunlar, ikili veya SOAP serileştirme ile daha tutarlı bir programlama modeli sağlamak için mevcuttur.

Bu özellikler hakkında daha fazla bilgi için bkz . İkili Serileştirme.

ve DataContractSerializer kullanımının kullandığı XML biçimleri NetDataContractSerializer normalde uyumlu değildir. Başka bir deyişle, bu seri hale getiricilerden biriyle seri hale getirme ve diğeriyle seri durumdan çıkarma girişimi desteklenen bir senaryo değildir.

Ayrıca, nesne grafında NetDataContractSerializer her düğüm için tam .NET Framework türü ve derleme adı çıkışını vermediğini unutmayın. Bu bilgiyi yalnızca belirsiz olduğu yerde oluşturur. Başka bir ifadeyle, kök nesne düzeyinde ve herhangi bir polimorfik durum için çıkış oluşturur.

Ayrıca bkz.