XmlSerializer Sınıfını Kullanma
Windows Communication Foundation (WCF), uygulamanızdaki verileri istemciler ve hizmetler arasında iletilen XML'ye dönüştürmek için iki farklı serileştirme teknolojisi kullanabilir: DataContractSerializer
ve XmlSerializer
.
DataContractSerializer
Varsayılan olarak WCF, veri türlerini serileştirmek için sınıfını DataContractSerializer kullanır. Bu seri hale getirici aşağıdaki türleri destekler:
İlkel türler (örneğin, tamsayılar, dizeler ve bayt dizileri) ve gibi temel öğeler olarak XmlElementDateTimeele alınan bazı özel türler.
Veri sözleşmesi türleri (özniteliğiyle DataContractAttribute işaretlenmiş türler).
arabirimini SerializableAttribute uygulayan ISerializable türleri içeren özniteliğiyle işaretlenmiş türler.
Arabirimi uygulayan IXmlSerializable türler.
Birçok genel koleksiyon türü içeren birçok yaygın koleksiyon türü.
Birçok .NET Framework türü ikinci iki kategoriye ayrılır ve bu nedenle serileştirilebilir. Serileştirilebilir tür dizileri de serileştirilebilir. Tam liste için bkz . Hizmet Sözleşmelerinde Veri AktarımıNı Belirtme.
DataContractSerializerveri sözleşmesi türleriyle birlikte kullanılan , yeni WCF hizmetleri yazmanın önerilen yoludur. Daha fazla bilgi için bkz . Veri Sözleşmelerini Kullanma.
Xmlserializer
WCF sınıfını XmlSerializer da destekler. XmlSerializer sınıfı WCF için benzersiz değildir. Web hizmetlerinin kullandığı serileştirme altyapısıyla aynı ASP.NET. sınıfı XmlSerializer , sınıftan çok daha dar bir tür DataContractSerializer kümesini destekler, ancak sonuçta elde edilen XML üzerinde çok daha fazla denetime izin verir ve XML Şema tanım dili (XSD) standardının çok daha fazlasını destekler. Ayrıca seri hale getirilebilir türlerde bildirim temelli öznitelikler gerektirmez. Daha fazla bilgi için .NET Framework belgelerindeki XML Serileştirme konusuna bakın. XmlSerializer sınıfı veri sözleşmesi türlerini desteklemez.
Visual Studio'da üçüncü taraf bir hizmet için istemci kodu oluşturmak veya üçüncü taraf bir şemaya erişmek için Svcutil.exe veya Hizmet Başvurusu Ekle özelliği kullanılırken, sizin için otomatik olarak uygun bir seri hale getirici seçilir. Şema ile DataContractSerializerXmlSerializer uyumlu değilse, seçilidir.
XmlSerializer'a geçme
Bazen el ile öğesine XmlSerializergeçmeniz gerekebilir. Bu, örneğin aşağıdaki durumlarda gerçekleşir:
Bir uygulamayı ASP.NET Web hizmetlerinden WCF'ye geçirirken, yeni veri sözleşmesi türleri oluşturmak yerine mevcut ve XmlSerializeruyumlu türleri yeniden kullanmak isteyebilirsiniz.
İletilerde görünen XML üzerinde hassas denetim önemliyse, ancak bir Web Hizmetleri Açıklama Dili (WSDL) belgesi kullanılamıyorsa, örneğin, DataContractSerializer ile uyumlu olmayan belirli standartlaştırılmış, yayımlanmış bir şemaya uyması gereken türlerde bir hizmet oluştururken.
Eski SOAP Kodlama standardına uyan hizmetler oluştururken.
Bu ve diğer durumlarda, aşağıdaki kodda XmlSerializer gösterildiği gibi özniteliğini hizmetinize uygulayarak XmlSerializerFormatAttribute
sınıfına el ile geçiş yapabilirsiniz.
[ServiceContract]
[XmlSerializerFormat]
public class BankingService
{
[OperationContract]
public void ProcessTransaction(BankingTransaction bt)
{
// Code not shown.
}
}
//BankingTransaction is not a data contract class,
//but is an XmlSerializer-compatible class instead.
public class BankingTransaction
{
[XmlAttribute]
public string Operation;
[XmlElement]
public Account fromAccount;
[XmlElement]
public Account toAccount;
[XmlElement]
public int amount;
}
//Notice that the Account class must also be XmlSerializer-compatible.
<ServiceContract(), XmlSerializerFormat()> _
Public Class BankingService
<OperationContract()> _
Public Sub ProcessTransaction(ByVal bt As BankingTransaction)
' Code not shown.
End Sub
End Class
' BankingTransaction is not a data contract class,
' but is an XmlSerializer-compatible class instead.
Public Class BankingTransaction
<XmlAttribute()> _
Public Operation As String
<XmlElement()> _
Public fromAccount As Account
<XmlElement()> _
Public toAccount As Account
<XmlElement()> _
Public amount As Integer
End Class
'Notice that the Account class must also be XmlSerializer-compatible.
Güvenlikle İlgili Dikkat Edilmesi Gerekenler
Not
Serileştirme altyapılarını değiştirirken dikkatli olmak önemlidir. Aynı tür, kullanılan seri hale getiriciye bağlı olarak XML'e farklı şekilde seri hale getirilebilir. Yanlışlıkla yanlış seri hale getirici kullanıyorsanız, açıklamayı amaçlamadığınız türden bilgileri ifşa ediyor olabilirsiniz.
Örneğin, DataContractSerializer sınıf yalnızca veri sözleşmesi türlerini serileştirirken özniteliğiyle DataMemberAttribute işaretlenmiş üyeleri serileştirir. XmlSerializer sınıfı, herhangi bir genel üyeyi serileştirir. Aşağıdaki koddaki türe bakın.
[DataContract]
public class Customer
{
[DataMember]
public string firstName;
[DataMember]
public string lastName;
public string creditCardNumber;
}
<DataContract()> _
Public Class Customer
<DataMember()> _
Public firstName As String
<DataMember()> _
Public lastName As String
Public creditCardNumber As String
End Class
Tür, sınıfın seçildiği XmlSerializer bir hizmet sözleşmesinde yanlışlıkla kullanılıyorsa, creditCardNumber
üye serileştirilir ve bu büyük olasılıkla amaçlanmamıştır.
Sınıf varsayılan olsa DataContractSerializer da, özniteliğini hizmet sözleşmesi türüne uygulayarak DataContractFormatAttribute hizmetiniz için açıkça seçebilirsiniz (bunu yapmak hiçbir zaman gerekli olmamalıdır).
Hizmet için kullanılan seri hale getirici sözleşmenin ayrılmaz bir parçasıdır ve farklı bir bağlama seçilerek veya diğer yapılandırma ayarları değiştirilerek değiştirilemez.
Diğer önemli güvenlik konuları sınıfı için XmlSerializer geçerlidir. İlk olarak, sınıfını kullanan tüm WCF uygulamalarının XmlSerializer açıklanmasını önleyen bir anahtarla imzalanması kesinlikle önerilir. Bu öneri, hem el ile geçiş XmlSerializer yapıldığında hem de otomatik bir anahtar gerçekleştirildiğinde (Svcutil.exe, Hizmet Başvurusu Ekle veya benzer bir araç tarafından) geçerlidir. Bunun nedeni, serileştirme altyapısının XmlSerializer uygulamayla aynı anahtarla imzalanmış oldukları sürece önceden oluşturulmuş serileştirme derlemelerinin yüklenmesini desteklemesidir. İmzasız bir uygulama, önceden oluşturulmuş serileştirme derlemesinin beklenen adıyla eşleşen kötü amaçlı bir derlemenin uygulama klasörüne veya genel derleme önbelleğine yerleştirilmesi olasılığına karşı tamamen korumasızdır. Elbette, bir saldırganın bu eylemi denemesi için önce bu iki konumdan birine yazma erişimine sahip olması gerekir.
Kullandığınız XmlSerializer her durumda var olan bir diğer tehdit de sistem geçici klasörüne yazma erişimiyle ilgilidir. Serileştirme XmlSerializer altyapısı bu klasörde geçici serileştirme derlemeleri oluşturur ve kullanır. Geçici klasöre yazma erişimi olan tüm işlemlerin kötü amaçlı kodla bu serileştirme derlemelerinin üzerine yazabileceğini unutmayın.
XmlSerializer desteği için kurallar
Sözleşme işlemi parametrelerine veya dönüş değerlerine doğrudan uyumlu öznitelikler uygulayamazsınız XmlSerializer. Ancak, aşağıdaki kodda gösterildiği gibi, yazılan iletilere (ileti sözleşmesi gövde parçaları) uygulanabilir.
[ServiceContract]
[XmlSerializerFormat]
public class BankingService
{
[OperationContract]
public void ProcessTransaction(BankingTransaction bt)
{
//Code not shown.
}
}
[MessageContract]
public class BankingTransaction
{
[MessageHeader]
public string Operation;
[XmlElement, MessageBodyMember]
public Account fromAccount;
[XmlElement, MessageBodyMember]
public Account toAccount;
[XmlAttribute, MessageBodyMember]
public int amount;
}
<ServiceContract(), XmlSerializerFormat()> _
Public Class BankingService
<OperationContract()> _
Public Sub ProcessTransaction(ByVal bt As BankingTransaction)
'Code not shown.
End Sub
End Class
<MessageContract()> _
Public Class BankingTransaction
<MessageHeader()> _
Public Operation As String
<XmlElement(), MessageBodyMember()> _
Public fromAccount As Account
<XmlElement(), MessageBodyMember()> _
Public toAccount As Account
<XmlAttribute(), MessageBodyMember()> _
Public amount As Integer
End Class
Bu öznitelikler, yazılan ileti üyelerine uygulandığında, yazılan ileti özniteliklerinde çakışan özellikleri geçersiz kılar. Örneğin, aşağıdaki kodda öğesini ElementName
geçersiz kılar Name
.
[MessageContract]
public class BankingTransaction
{
[MessageHeader] public string Operation;
//This element will be <fromAcct> and not <from>:
[XmlElement(ElementName="fromAcct"), MessageBodyMember(Name="from")]
public Account fromAccount;
[XmlElement, MessageBodyMember]
public Account toAccount;
[XmlAttribute, MessageBodyMember]
public int amount;
}
<MessageContract()> _
Public Class BankingTransaction
<MessageHeader()> _
Public Operation As String
'This element will be <fromAcct> and not <from>:
<XmlElement(ElementName:="fromAcct"), _
MessageBodyMember(Name:="from")> _
Public fromAccount As Account
<XmlElement(), MessageBodyMember()> _
Public toAccount As Account
<XmlAttribute(), MessageBodyMember()> _
Public amount As Integer
End Class
MessageHeaderArrayAttribute özniteliği kullanılırken XmlSerializerdesteklenmez.
Not
Bu durumda, XmlSerializer WCF'nin öncesinde yayımlanan aşağıdaki özel durum oluşturulur: "Şemanın en üst düzeyinde bildirilen bir öğenin 1'i maxOccurs
> olamaz. veya yerine XmlElementAttribute
veya XmlArrayItem
Sarmalanmış parametre stilini kullanarak XmlArray
'more' için bir sarmalayıcı öğesi sağlayın."
Böyle bir özel durum alırsanız, bu durumun geçerli olup olmadığını araştırın.
WCF, ileti sözleşmelerinde ve işlem sözleşmelerindeki ve XmlIncludeAttribute özniteliklerini desteklemezSoapIncludeAttribute; bunun yerine özniteliğini KnownTypeAttribute kullanın.
IXmlSerializable Arabirimini Uygulayan Türler
arabirimini IXmlSerializable
uygulayan türler, tarafından DataContractSerializer
tam olarak desteklenir. XmlSchemaProviderAttribute Öznitelik, şemalarını denetlemek için her zaman bu türlere uygulanmalıdır.
Uyarı
Çok biçimli türleri serileştiriyorsanız, doğru türün seri hale getirildiğinden emin olmak için türüne uygulamanız XmlSchemaProviderAttribute gerekir.
Uygulayan IXmlSerializable
üç tür türü vardır: rastgele içeriği temsil eden türler, tek bir öğeyi temsil eden türler ve eski DataSet türler.
İçerik türleri, özniteliği tarafından
XmlSchemaProviderAttribute
belirtilen bir şema sağlayıcısı yöntemi kullanır. yöntemi döndürülmüyornull
ve özniteliğindeki IsAny özelliği varsayılan değerindefalse
bırakılır. Bu, türlerin en yaygın kullanımıdırIXmlSerializable
.Bir türün kendi kök öğe adını denetlemesi gerektiğinde öğe türleri kullanılır
IXmlSerializable
. Bir türü öğe türü olarak işaretlemek için özniteliğindeki IsAnyXmlSchemaProviderAttributetrue
özelliğini olarak ayarlayın veya şema sağlayıcısı yönteminden döndürin.null
Bir şema sağlayıcı yöntemine sahip olmak, öğe türleri için isteğe bağlıdır; içinde yöntem adıXmlSchemaProviderAttribute
yerine belirtebilirsiniznull
. Ancak, ise ve bir şema sağlayıcısı yöntemi belirtilirseIsAny
true
, yöntemi döndürmelidirnull
.Eski DataSet türler, özniteliğiyle
XmlSchemaProviderAttribute
işaretlenmemiş türlerdirIXmlSerializable
. Bunun yerine şema oluşturma yöntemine GetSchema güvenirler. Bu desen türü içinDataSet
kullanılır ve türü belirtilmiş veri kümesi .NET Framework'ün önceki sürümlerinde bir sınıf türetir, ancak artık kullanım dışıdır ve yalnızca eski nedenlerle desteklenir. Bu desene güvenmeyin ve her zaman türlerinizeIXmlSerializable
uygulayınXmlSchemaProviderAttribute
.
IXmlSerializable İçerik Türleri
Uygulayan ve daha önce tanımlandığı gibi bir içerik türü olan bir türün IXmlSerializable
veri üyesini serileştirirken, seri hale getirici veri üyesi için sarmalayıcı öğesini yazar ve denetimi yöntemine WriteXml geçirir. Uygulama WriteXml , sarmalayıcı öğesine öznitelikler eklemeyi içeren herhangi bir XML yazabilir. İşlem tamamlandıktan sonra WriteXml
seri hale getirici öğeyi kapatır.
Daha önce tanımlandığı gibi uygulayan IXmlSerializable
ve içerik türü olan bir türün veri üyesinin seri durumdan çıkarıldığında, seri durumdan çıkarıcı XML okuyucuyu veri üyesinin sarmalayıcı öğesine konumlandırır ve denetimi yöntemine ReadXml geçirir. yöntemi, başlangıç ve bitiş etiketleri de dahil olmak üzere öğenin tamamını okumalıdır. Kodunuzun ReadXml
öğenin boş olduğu durumu işlediğinden emin olun. Ayrıca, uygulamanız ReadXml
sarmalayıcı öğesinin belirli bir şekilde adlandırılmasını kullanmamalıdır. Seri hale getirici tarafından seçilen ad değişebilir.
İçerik türlerini çok biçimli olarak, örneğin türünün veri üyelerine Objectatamasına IXmlSerializable
izin verilir. Ayrıca tür örneklerinin null olması da izin verilir. Son olarak, nesne grafı koruması etkin ve ile NetDataContractSerializertürleri kullanmak IXmlSerializable
mümkündür. Tüm bu özellikler WCF seri hale getiricisinin sarmalayıcı öğesine ("nil" ve "type" xml şema örneği ad alanında ve "Id", "Ref", "Type" ve "Assembly" gibi belirli öznitelikleri WCF'ye özgü ad alanına eklemesini gerektirir.
ReadXml Uygulanırken Yoksayılması Gereken Öznitelikler
Denetimi kodunuza ReadXml
geçirmeden önce seri durumdan çıkarıcı XML öğesini inceler, bu özel XML özniteliklerini algılar ve bunlar üzerinde çalışır. Örneğin, "nil" ise true
, null bir değer seri durumdan çıkarılır ve ReadXml
çağrılmaz. Polimorfizm algılanırsa, öğenin içeriği farklı bir türmüş gibi seri durumdan çıkarılır. Polimorfik olarak atanan türün uygulaması çağrılır ReadXml
. Her durumda, bir ReadXml
uygulamanın seri durumdan çıkarıcı tarafından işlenmeleri nedeniyle bu özel öznitelikleri yoksayması gerekir.
IXmlSerializable İçerik Türleri için Şema Konuları
Şema ve IXmlSerializable
içerik türü dışarı aktarılırken şema sağlayıcısı yöntemi çağrılır. şema XmlSchemaSet sağlayıcısı yöntemine geçirilir. yöntemi, şema kümesine geçerli bir şema ekleyebilir. Şema kümesi, şema dışarı aktarma işlemi gerçekleştiğinde zaten bilinen şemayı içerir. Şema sağlayıcısı yönteminin şema kümesine bir öğe eklemesi gerektiğinde, kümede uygun ad alanına sahip bir XmlSchema öğesinin zaten var olup olmadığını belirlemelidir. Varsa, şema sağlayıcısı yöntemi yeni öğeyi var olan XmlSchema
öğesine eklemelidir. Aksi takdirde, yeni XmlSchema
bir örnek oluşturması gerekir. Tür dizileri IXmlSerializable
kullanılıyorsa bu önemlidir. Örneğin, "B" ad alanında "A" türü olarak dışarı aktarılan bir IXmlSerializable
türünüz varsa, şema sağlayıcısı yöntemi çağrıldığında şema kümesi "ArrayOfA" türünü tutmak için "B" şemasını zaten içeriyor olabilir.
öğesine türleri eklemeye XmlSchemaSetek olarak, içerik türleri için şema sağlayıcısı yöntemi null olmayan bir değer döndürmelidir. Verilen IXmlSerializable
tür için kullanılacak şema türünün adını belirten bir XmlQualifiedName döndürebilir. Bu nitelenmiş ad, türü için veri sözleşmesi adı ve ad alanı olarak da görev alır. Şema sağlayıcısı yöntemi döndürdüğünde şema kümesinde bulunmayan bir türü hemen döndürmesine izin verilir. Ancak, tüm ilgili türler dışarı aktarıldığında ( Export yöntemi üzerindeki XsdDataContractExporter tüm ilgili türler için çağrılır ve özelliğine Schemas erişilir), türün şema kümesinde mevcut olması beklenir. Tüm ilgili Export
çağrılar yapılmadan önce özelliğine Schemas
erişmek bir XmlSchemaExceptionile sonuçlanabilir. Dışarı aktarma işlemi hakkında daha fazla bilgi için bkz . Sınıflardan Şemaları Dışarı Aktarma.
Şema sağlayıcısı yöntemi, kullanılacak değerini XmlSchemaType de döndürebilir. Tür anonim olabilir veya olmayabilir. Anonimse, türün şeması IXmlSerializable
, tür her IXmlSerializable
veri üyesi olarak kullanıldığında anonim bir tür olarak dışarı aktarılır. Türün IXmlSerializable
hala bir veri sözleşmesi adı ve ad alanı vardır. (Bu, Veri Sözleşmesi Adları , özniteliğin DataContractAttribute adı özelleştirmek için kullanılamayacağı durumlar dışında.) Anonim değilse, içindeki XmlSchemaSet
türlerden biri olmalıdır. Bu durum, türü döndürmeye XmlQualifiedName
eşdeğerdir.
Ayrıca, tür için genel öğe bildirimi dışarı aktarılır. Türe özniteliği uygulanmamışsa XmlRootAttribute , öğe veri sözleşmesiyle aynı ada ve ad alanına sahiptir ve "nillable" özelliği olur true
. Bunun tek istisnası şema ad alanıdır (http://www.w3.org/2001/XMLSchema
) – türün veri sözleşmesi bu ad alanındaysa, şema ad alanına yeni öğe eklenmesi yasak olduğundan ilgili genel öğe boş ad alanındadır. Türün XmlRootAttribute
özniteliği uygulanmışsa, genel öğe bildirimi aşağıdakiler kullanılarak dışarı aktarılır: ElementNameve NamespaceIsNullable özellikleri. Uygulanan varsayılanlar XmlRootAttribute
veri sözleşmesi adı, boş bir ad alanı ve "nillable" şeklindedir true
.
Aynı genel öğe bildirimi kuralları eski veri kümesi türleri için de geçerlidir. öğesininXmlRootAttribute
, şema sağlayıcısı yöntemi kullanılarak veya eski veri kümesi türleri için aracılığıyla öğesine eklenen özel kod aracılığıyla GetSchema
eklenen XmlSchemaSet
genel öğe bildirimlerini geçersiz kılamayacağını unutmayın.
IXmlSerializable Öğe Türleri
IXmlSerializable
öğe türlerinin IsAny
özelliği olarak true
ayarlanmış veya şema sağlayıcısı yönteminin döndüreceği null
bir öğesi vardır.
Bir öğe türünü seri hale getirme ve seri durumdan çıkarma, içerik türünü seri hale getirme ve seri durumdan çıkarma işlemine çok benzer. Ancak bazı önemli farklılıklar vardır:
Uygulamanın
WriteXml
tam olarak bir öğe yazması beklenir (elbette birden çok alt öğe içerebilir). Bu tek öğenin, birden çok eşdüzey öğenin veya karma içeriğin dışında öznitelik yazmamalıdır. öğesi boş olabilir.Uygulama
ReadXml
sarmalayıcı öğesini okumamalıdır. Üreten bir öğeyiWriteXml
okuması beklenir.Bir öğe türünü düzenli olarak seri hale getirdiğinizde (örneğin, bir veri sözleşmesinde veri üyesi olarak), seri hale getirici, içerik türlerinde olduğu gibi çağrısından
WriteXml
önce bir sarmalayıcı öğesi çıkarır. Ancak, bir öğe türünü en üst düzeyde serileştirirken, veyaNetDataContractSerializer
oluşturucularında seri hale getirici oluşturulurken açıkça bir kök adı ve ad alanı belirtilmediği sürece, seri hale getiriciDataContractSerializer
normalde yazan öğeninWriteXml
çevresinde bir sarmalayıcı öğesi çıkarmaz. Daha fazla bilgi için bkz . Serileştirme ve Seri Durumdan Çıkarma.Yapı zamanında WriteStartObject kök adı ve ad alanını belirtmeden en üst düzeyde bir öğe türünü seri hale getirirken ve WriteEndObject temelde hiçbir şey yapmaz ve WriteObjectContent çağırır
WriteXml
. Bu modda, seri hale getirilen nesne çok biçimli olarak atanamaznull
ve atanamaz. Ayrıca nesne grafı koruması etkinleştirilemez veNetDataContractSerializer
kullanılamaz.Yapı zamanında kök adı ve ad alanını belirtmeden en üst düzeydeki bir öğe türünü seri durumdan çıkarırken, IsStartObject herhangi bir öğenin başlangıcını bulabiliyorsa döndürür
true
. ReadObject parametresi ayarlıverifyObjectName
true
olduğundan, nesneyi gerçekten okumadan önce olduğu gibiIsStartObject
davranır.ReadObject
ardından denetimi yöntemineReadXml
geçirir.
Öğe türleri için dışarı aktarılan şema, önceki bölümde açıklanan türle aynıdır XmlElement
, ancak şema sağlayıcısı yöntemi içerik türleriyle olduğu gibi öğesine herhangi bir ek şema XmlSchemaSet ekleyebilir. özniteliğinin öğe türleriyle kullanılmasına XmlRootAttribute
izin verilmez ve bu türler için hiçbir zaman genel öğe bildirimleri gösterilmez.
XmlSerializer'dan farklar
IXmlSerializable
Arabirimi ve XmlSchemaProviderAttribute
ve XmlRootAttribute
öznitelikleri de tarafından XmlSerializer anlaşılır. Ancak, bunların veri sözleşmesi modelinde nasıl ele alındıklarında bazı farklılıklar vardır. Önemli farklar aşağıdaki listede özetlenir:
şema sağlayıcısı yönteminin içinde
XmlSerializer
kullanılabilmesi için public olması gerekir, ancak veri sözleşmesi modelinde kullanılmak için public olması gerekmez.Şema sağlayıcısı yöntemi, veri sözleşmesi modelinde olduğunda
IsAny
true
çağrılır ancak ile çağrılmazXmlSerializer
.XmlRootAttribute
öznitelik içerik veya eski veri kümesi türleri için mevcut olmadığında,XmlSerializer
boş ad alanında bir genel öğe bildirimi dışarı aktarır. Veri sözleşmesi modelinde kullanılan ad alanı normalde daha önce açıklandığı gibi veri sözleşmesi ad alanıdır.
Her iki serileştirme teknolojisiyle de kullanılan türler oluştururken bu farklılıklara dikkat edin.
IXmlSerializable Şemasını İçeri Aktarma
Türlerden IXmlSerializable
oluşturulan bir şemayı içeri aktarırken birkaç olasılık vardır:
Oluşturulan şema, Veri Sözleşmesi Şema Başvurusu'nda açıklandığı gibi geçerli bir veri sözleşmesi şeması olabilir. Bu durumda şema her zamanki gibi içeri aktarılabilir ve normal veri sözleşmesi türleri oluşturulur.
Oluşturulan şema geçerli bir veri sözleşmesi şeması olmayabilir. Örneğin, şema sağlayıcısı yönteminiz veri sözleşmesi modelinde desteklenmeyen XML özniteliklerini içeren bir şema oluşturabilir. Bu durumda, şemayı tür olarak
IXmlSerializable
içeri aktarabilirsiniz. Bu içeri aktarma modu varsayılan olarak açık değildir, ancak kolayca etkinleştirilebilir; örneğin,/importXmlTypes
komut satırı ServiceModel Meta Veri Yardımcı Programı Aracı'na (Svcutil.exe) geçiş yaparak. Bu, Sınıf Oluşturmak için Şemayı İçeri Aktarma bölümünde ayrıntılı olarak açıklanmıştır. Tür örnekleriniz için doğrudan XML ile çalışmanız gerektiğini unutmayın. Daha geniş bir şema aralığını destekleyen farklı bir serileştirme teknolojisi kullanmayı da düşünebilirsiniz. kullanma konusunaXmlSerializer
bakın.Yeni türler oluşturmak yerine var olan
IXmlSerializable
türlerinizi ara sunucu içinde yeniden kullanmak isteyebilirsiniz. Bu durumda, Şemayı Tür Oluşturmak için İçeri Aktarma konusunda açıklanan başvuruda bulunılan türler özelliği, yeniden kullanılacak türü belirtmek için kullanılabilir. Bu, yeniden kullanılan türleri içeren derlemeyi/reference
belirten svcutil.exe üzerindeki anahtarın kullanılmasına karşılık gelir.
XmlSerializer Eski Davranışı
.NET Framework 4.0 ve önceki sürümlerinde XmlSerializer, bir dosyaya C# kodu yazarak geçici serileştirme derlemeleri oluşturdu. Dosya daha sonra bir derlemede derlendi. Bu davranış, seri hale getirici için başlangıç süresini yavaşlatma gibi istenmeyen sonuçlar doğurdu. .NET Framework 4.5'te bu davranış, derleyicinin kullanılmasına gerek kalmadan derlemeleri oluşturacak şekilde değiştirildi. Bazı geliştiriciler oluşturulan C# kodunu görmek isteyebilir. Aşağıdaki yapılandırmayla bu eski davranışın kullanılmasını belirtebilirsiniz:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.xml.serialization>
<xmlSerializer tempFilesLocation='e:\temp\XmlSerializerBug' useLegacySerializerGeneration="true" />
</system.xml.serialization>
<system.diagnostics>
<switches>
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
</configuration>
Türetilmiş bir sınıfı genel olmayan yeni geçersiz kılmayla seri hale getirememesi gibi XmlSerializer
uyumluluk sorunlarıyla karşılaşırsanız, aşağıdaki yapılandırmayı XMLSerializer
kullanarak eski davranışa geri dönebilirsiniz:
<configuration>
<appSettings>
<add key="System:Xml:Serialization:UseLegacySerializerGeneration" value="true" />
</appSettings>
</configuration>
Yukarıdaki yapılandırmaya alternatif olarak, .NET Framework 4.5 veya sonraki bir sürümü çalıştıran bir makinede aşağıdaki yapılandırmayı kullanabilirsiniz:
<configuration>
<system.xml.serialization>
<xmlSerializer useLegacySerializerGeneration="true"/>
</system.xml.serialization>
</configuration>
Not
Anahtar <xmlSerializer useLegacySerializerGeneration="true"/>
yalnızca .NET Framework 4.5 veya sonraki bir sürümü çalıştıran bir makinede çalışır. Yukarıdaki appSettings
yaklaşım tüm .NET Framework sürümlerinde çalışır.