Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 hale getirilirken, seri hale getirici XmlReader ve XmlWriter sınıflarını 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 XmlDictionaryReader ve XmlDictionaryWriter sınıflarını destekler.
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.
- BinaryFormatter ve SoapFormatter seri hale getiricilerine benzer çünkü serileştirilmiş verilerin bir parçası olarak .NET Framework tür adlarını da yayar.
- Aynı türler, serileştirme ve seri hale geri döndürme süreçlerinde paylaşıldığında kullanılır.
DataContractSerializer ve NetDataContractSerializer ortak bir temel sınıf olan XmlObjectSerializer'den türetilmiştir.
Uyarı
DataContractSerializer, 20'nin altında bir onaltılık değere sahip denetim karakterleri içeren dizeleri XML öğeleri 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 type parametresi kullanılarak 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 DataContractSerializer sınıfının örneklerini serileştirmek veya seri durumdan çıkarmak için kullanılabilecek bir Person örneği 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
Serileştirilecek türlerde, KnownTypeAttribute özniteliği veya başka bir mekanizma yardımıyla henüz işlenmemiş polimorfizm varsa, olası bilinen türlerin bir listesi, seri hale getiricinin yapıcısına knownTypes parametresi kullanılarak geçilmelidir. 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ördüncü sınıflar (Book ve Newspaper), LibraryItem sınıfından devralır.
[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, knownTypes parametresini kullanarak seri hale getiricinin bir örneğini 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, Name ve Namespace sınıflarının oluşturucularında DataContractAttribute ve DataMemberAttribute değerlerini ayarlar.
[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, rootName ve rootNamespace parametrelerinin değerlerini DataContractSerializer oluşturucusuna geçirerek kök öğenin varsayılan adını ve ad alanını özelleştirebilirsiniz. Unutmayın, rootNamespace öğesi, veri üyelerine karşılık gelen kapsanan öğelerin ad alanını etkilemez. 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 ignoreExtensionDataObject şeklinde ayarlanmış bir false parametreye sahiptir. Bu varsayılan modda, veri sözleşmesi IExtensibleDataObject arabirimini uyguladığı sürece, veriler daha yeni bir sürümden daha eski bir sürüme ve tekrar daha yeni bir sürüme gidiş dönüşte kayıpsız olarak gönderilebilir. Örneğin, Person veri sözleşmesinin 1. sürümü Name ve PhoneNumber veri üyelerini içerirken, 2. sürümüne bir Nickname üyesi eklenmiştir. 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. Forward-Compatible 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 gereksiz verileri seri durumdan çıkarmak ve depolamak bir 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ğerler içermeyen veri 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.
Yuvarlak Seyahatleri Etkinleştirme ve Devre Dışı Bırakma
Round trip özelliğini kapatmak için, IExtensibleDataObject arabirimini uygulamayın. Türler üzerinde denetiminiz yoksa, aynı etkiyi elde etmek için ignoreExtensionDataObject parametresini true olarak 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
billTo ve shipTo alanlarının 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 referanslar. Eğer nesneler, başka nesneler aracılığıyla bile kendilerine atıfta bulunuyorsa, çoğaltma yoluyla seri hale getirme sonsuz bir döngüye yol açar. (Seri hale getirici böyle bir durumda bir SerializationException atar.)
Anlambilim. 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ı, http://schemas.microsoft.com/2003/10/Serialization/ standart serileştirme ad alanını ifade 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:
XML,
DataContractSerializerilepreserveObjectReferencesayarlanantrue, hiçbir başka teknolojiyle birlikte çalışamaz ve yalnızca başka birDataContractSerializerörneği tarafından,preserveObjectReferencesyinetrueolarak ayarlandığında erişilebilir.Bu özellik için meta veri (şema) desteği yoktur. Ayar
preserveObjectReferencesolarakfalseyapıldığında üretilen şema yalnızca bu durum 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 modu etkinleştirildiğinde, maxItemsInObjectGraph değerini doğru kotaya ayarlamak ö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üklemelerinde dataContractSurrogate olarak ayarlanabilen bir null parametre bulunur. Aksi takdirde, arabirimi uygulayan bir tür olan IDataContractSurrogate 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.
Seri -leştirme
Aşağıdaki bilgiler, XmlObjectSerializer ve DataContractSerializer sınıfları dahil olmak üzere, NetDataContractSerializer tarafından devralınan 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. Üç aşırı yükleme vardır, her biri bir Stream, XmlWriter veya XmlDictionaryWriter öğesine yazmak için. Aşırı yükleme ile Stream, çıkış UTF-8 kodlamasında XML formatında olur. XmlDictionaryWriter aşırı yükleme durumunda, serileştirici, çıktısını ikili XML formatı için optimize eder.
WriteObject yöntemini kullanırken, seri hale getirici sarmalayıcı öğesi için varsayılan adı ve ad alanını kullanır ve içeriği onunla birlikte yazar (önceki "Varsayılan Kök Adı ve Ad Alanını Belirtme" bölümüne bakın).
Aşağıdaki örnekte bir XmlDictionaryWriter ile yazmak 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-By-Step Serileştirme
WriteStartObject, WriteObjectContent, ve WriteEndObject yöntemlerini sırasıyla bitiş öğesini yazmak, nesne içeriğini yazmak ve sarmalayıcı öğesini kapatmak için kullanın.
Uyarı
Bu yöntemlerin aşırı yüklemesi yoktur Stream .
Bu adım adım serileştirmenin iki yaygın kullanımı vardır. Bu yöntemlerden biri, aşağıdaki örnekte gösterildiği gibi, WriteStartObject ve WriteObjectContent arasına öznitelikler veya yorumlar 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 başka yaygın yöntem, tamamen WriteStartObject ve WriteEndObject kullanmaktan kaçınmak ve aşağıdaki kodda gösterildiği gibi kendi özel sarmalayıcı öğenizi yazmak (hatta sarmalayıcı yazmaktan tamamen vazgeçebilirsiniz).
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>
Uyarı
Adım adım serileştirmenin kullanılması şema geçersiz XML'ye neden olabilir.
Seri durumdan çıkarma
Aşağıdaki bilgiler, XmlObjectSerializer ve DataContractSerializer sınıfları dahil olmak üzere, NetDataContractSerializer tarafından devralınan tüm sınıflar için geçerlidir.
Bir nesneyi seri durumdan çıkarmanın en temel yolu, aşırı yüklenmiş ReadObject yöntemlerden birini çağırmaktır. Üç aşırı yükleme vardır, her biri XmlDictionaryReader, XmlReader veya Stream ile okumak için. 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, ReadObject yönteminin döndürdüğü nesnenin uygun tipe dönüştürülmesi gerektiğini unutmayın.
Aşağıdaki kod, bir DataContractSerializer ve bir XmlDictionaryReader örneği oluşturur, ardından bir Person örneğini seri durumdan çıkarı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. Aşağıdaki kodda gösterildiği gibi, Read veya türevinden XmlReader yöntemini çağırabilir ve NodeType'yi test edebilirsiniz.
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($"{p.Name} {p.Address} id:{2}");
}
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
Unutmayın, okuyucuyu ReadObject öğesine vermeden önce, bu sarmalayıcı öğedeki öznitelikleri okuyabilirsiniz.
Seri durumdan çıkarıcı, basit bir ReadObject aşırı yükleme 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 istisna fırlatır. 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; ReadObject yönteminin bazı aşırı yüklemeleri, varsayılan olarak verifyObjectName olarak ayarlanan true adlı Boole parametresini 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
DataContractSerializer ile NetDataContractSerializer arasındaki birincil fark, DataContractSerializer'nin veri sözleşmesi adlarını kullanması, oysa NetDataContractSerializer'nin serileştirilmiş XML'de tam .NET Framework derleme ve tür adlarını çıktılamasıdı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, NetDataContractSerializer ile bilinen türler mekanizmasının gerekli olmadığı anlamına gelir.
Ancak, birkaç sorun oluşabilir:
Güvenlik. Seri durumdan çıkarılan XML'de bulunan herhangi bir tür yüklenir. Bu, kötü amaçlı türlerin yüklenmesini zorlamak için kullanılabilir.
NetDataContractSerializergüvenilmeyen verilerle yalnızca bir Serileştirme Bağlayıcısı kullanıldığında (özellik veya oluşturucu parametresi kullanılarak) kullanı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. AssemblyFormat özelliğini veya oluşturucu parametresini varsayılan değer Simple yerine Full olarak ayarlamak, derleme sürüm değişikliklerine izin verir, ancak genel parametre türlerine 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'ün uzak iletişimi (özellikle BinaryFormatter ve SoapFormatter) için kullanılan ikili veya SOAP serileştirme mekanizmasına benzer.
NetDataContractSerializer öğesinin kullanımı, DataContractSerializer öğesinin kullanımına benzer, ancak aşağıdaki farklar vardır:
Oluşturucular bir kök türü belirtmenizi gerektirmez. Herhangi bir türü aynı
NetDataContractSerializerörneğiyle seri hale getirmek mümkündür.Oluşturucular, bilindik türlerin bir 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, ISurrogateSelector (hangi
surrogateSelectorözelliğiyle eşleşir) olarak adlandırılan bir SurrogateSelector parametresini kabul eder. Bu eski bir vekil mekanizmadır.Oluşturucular,
assemblyFormatFormatterAssemblyStyle adlı ve AssemblyFormat özelliğine eşleyen bir parametreyi kabul eder. 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, StreamingContext özelliğine eşlenen
contextadlı bir Context parametresini kabul eder. Bilgileri seri hale getirilen türlere geçirmek için bunu kullanabilirsiniz. Bu kullanım, diğer StreamingContext sınıflarda kullanılan mekanizmayla System.Runtime.Serialization aynıdır.Serialize ve Deserialize yöntemleri ve WriteObject yöntemleri için ReadObject 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.
NetDataContractSerializer ve DataContractSerializer tarafından kullanılan XML biçimleri genellikle 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.