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), 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 XmlElement ile DateTime gibi temel öğeler olarak ele alınan bazı özel türler.
Veri sözleşmesi türleri (özniteliğiyle DataContractAttribute işaretlenmiş türler).
SerializableAttribute özniteliğiyle işaretlenmiş ve ISerializable arabirimini uygulayan türleri içeren türler.
Arayüzü 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, XmlSerializer sınıfını da destekler. XmlSerializer sınıfı WCF için benzersiz değildir. ASP.NET Web hizmetlerinin kullandığı serileştirme altyapısıyla aynıdır. 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 DataContractSerializer ile uyumlu değilse, XmlSerializer seçilir.
XmlSerializer'a geçme
Bazen manuel olarak XmlSerializer öğesine geç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
Uyarı
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, XmlSerializer sınıfının seçildiği bir hizmet sözleşmesinde yanlışlıkla kullanılırsa, creditCardNumber üye serileştirilir ve bu muhtemelen istenmeyen bir durumdur.
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 XmlSerializer geçişi yapıldığında hem de otomatik bir geçiş 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 seferinde mevcut olan başka bir tehdit, sistem geçici klasörüne yazma erişimi ile 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 ElementName, Name öğesini geçersiz kılar.
[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.
Uyarı
Bu durumda, XmlSerializer WCF'den önce meydana gelen şu istisnayı ortaya çıkarır: "Şemanın en üst düzeyinde bildirilen bir öğe, maxOccurs> 1 içermemelidir." 'more' için XmlArray yerine XmlArrayItem veya XmlElementAttribute kullanarak veya Sarmalanmış parametre stilini kullanarak 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 SoapIncludeAttribute ve XmlIncludeAttribute özniteliklerini desteklemez; bunun yerine KnownTypeAttribute özniteliğini kullanın.
IXmlSerializable Arabirimini Uygulayan Tipler
IXmlSerializable arayüzünü uygulayan türler, DataContractSerializer tarafından 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
XmlSchemaProviderAttributebelirtilen bir şema sağlayıcısı yöntemi kullanır. Yöntemnulldöndürmez ve öznitelikteki IsAny özelliği varsayılan değerindefalseolarak 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, IsAny özelliğini XmlSchemaProviderAttribute özniteliğindetrueolarak ayarlayın veya şema sağlayıcı yöntemindennulldöndürün. Bir şema sağlayıcı yöntemine sahip olmak, öğe türleri için isteğe bağlıdır; yöntem adı yerinenullbelirtebilirsinizXmlSchemaProviderAttributeiçinde. Ancak,IsAnytrueise ve bir şema sağlayıcısı yöntemi belirtilmişse, yönteminnulldöndürmesi gerekir.Eski DataSet türler,
IXmlSerializabletürlerdir veXmlSchemaProviderAttributeözniteliğiyle işaretlenmemiştir. Bunun yerine şema oluşturma yöntemine GetSchema güvenirler. Bu desen türü içinDataSetkullanı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 veXmlSchemaProviderAttributeöğesini her zamanIXmlSerializabletürlerinize uygulayın.
IXmlSerializable İçerik Türleri
IXmlSerializable uygulayan ve daha önce bir içerik türü olarak tanımlanan bir türün veri üyesini serileştirirken, serileştirici veri üyesi için sarmalayıcı öğeyi yazar ve denetimi WriteXml yöntemine geçirir. Uygulama WriteXml , sarmalayıcı öğesine öznitelikler eklemeyi içeren herhangi bir XML yazabilir. İşlem tamamlandıktan sonra serileştirici WriteXml öğeyi kapatır.
Daha önce tanımlandığı gibi IXmlSerializable uygulayan ve içerik türü olan bir türün veri üyesi seri durumdan çıkarıldığında, seri durumdan çıkarıcı XML okuyucuyu veri üyesinin sarmalayıcı öğesine konumlandırır ve kontrolü ReadXml yöntemine 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.
IXmlSerializable içerik türlerini çok biçimli olarak, türü Object olan veri üyelerine atamak izin verilmiştir. Ayrıca tür örneklerinin null olması da izin verilir. Son olarak, nesne grafiğinin korunması etkinleştirilmiş ve IXmlSerializable ile NetDataContractSerializer türleri kullanmak mümkündür. Tüm bu özellikler, WCF seri hale getiricisinin belirli öznitelikleri - "nil" ve "type" XML Şema Örneği ad alanında, "Id", "Ref", "Type" ve "Assembly" WCF'ye özgü ad alanında - sarmal öğeye 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" `true` olarak temsil ediliyorsa, boş bir değer seri durumdan çıkarılır ve `ReadXml` çağrılmaz. Polimorfizm tespit edilirse, öğenin içeriği farklı bir türmüş gibi seri durumdan çıkarılır. Polimorfik olarak atanan türün ReadXml uygulaması çağrılır. 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. Bir XmlSchemaSet şema 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 XmlQualifiedName tür için kullanılacak şema türünün adını belirten bir IXmlSerializable döndürebilir. Bu nitelenmiş ad, türün 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 Schemas çağrılar yapılmadan önce Export özelliğine erişmek bir XmlSchemaException ile 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ı metodu, kullanılacak XmlSchemaType değerini de döndürebilir. Tür anonim olabilir veya olmayabilir. Eğer anonimse, türün IXmlSerializable şeması, tür her IXmlSerializable veri üyesi olarak kullanıldığında anonim bir tür olarak dışarı aktarılır.
IXmlSerializable türü hala bir veri sözleşmesi adına ve ad alanına sahiptir. (Bu, Veri Sözleşmesi Adları'nda açıklandığı şekilde belirlenir, yalnızca ismin özelleştirilmesi için DataContractAttribute özniteliği kullanılamaz.) Anonim değilse, XmlSchemaSet içindeki türlerden biri olmalıdır. Bu durum, türün XmlQualifiedName'sini döndürmeye eşdeğerdir.
Ayrıca, tür için genel öğe bildirimi dışarı aktarılır. Tipin üzerine XmlRootAttribute özelliği uygulanmamışsa, öğe veri sözleşmesiyle aynı ada ve ad alanına sahip olur ve "boş olabilir" özelliği 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. Not edin ki XmlRootAttribute küresel öğe bildirimleri, şema sağlayıcısı yöntemi kullanılarak XmlSchemaSet veya eski veri kümesi türleri için GetSchema aracılığıyla eklenen özel kod üzerinden geçersiz kılınamaz.
IXmlSerializable Öğe Türleri
IXmlSerializable öğe türleri IsAny özelliğinin true olarak ayarlandığı veya şema sağlayıcısı yönteminin null döndürdüğü bir duruma sahiptir.
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
WriteXmlsadece bir öğe yazması beklenir (elbette içinde birden çok alt öğe barındırabilir). Bu tek öğenin, birden çok eşdüzey öğenin veya karma içeriğin dışında öznitelik yazmamalıdır. öğesi boş olabilir.Uygulama
ReadXmlsarmalayıcı öğesini okumamalıdır.WriteXmltarafından üretilen tek bir öğeyi 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, seri hale getiriciWriteXmltarafından yazılan öğenin çevresinde bir sarmalayıcı öğesi normalde hiç çıkarmaz; aksi belirtilmedikçe, seri hale getirme sırasındaDataContractSerializerveyaNetDataContractSerializeroluşturucularında açıkça bir kök adı ve ad alanı belirlenmelidir. Daha fazla bilgi için bkz . Serileştirme ve Seri Durumdan Çıkarma.Yapı zamanında kök adını ve ad alanını belirtmeden en üst düzeyde bir öğe türünü seri hale getirirken, WriteStartObject ve WriteEndObject temelde hiçbir şey yapmaz, WriteObjectContent ise
WriteXmlçağırır. Bu modda, serileştirilen nesnenullolamaz ve çok biçimli olarak atanamaz. Ayrıca nesne grafı koruması etkinleştirilemez veNetDataContractSerializerkullanılamaz.Yapı zamanında kök adı ve ad alanı belirtilmeden en üst düzeydeki öğe türünü seri durumdan çözme işlemi sırasında, IsStartObject herhangi bir öğenin başlangıcını bulabiliyorsa
truedöndürür. ReadObject parametresiverifyObjectNameolarak ayarlandığında, nesneyi gerçekten okumadan öncetruegibi davranır.ReadObjectardından kontrolüReadXmlyöntemine geçirir.
Öğe türleri için dışarı aktarılan şema, önceki bölümde açıklanan XmlElement türüyle aynıdır; ancak, şema sağlayıcı yöntemi, içerik türlerinde olduğu gibi, XmlSchemaSet öğesine herhangi bir ek şema 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 ile XmlSchemaProviderAttribute ve XmlRootAttribute öznitelikleri de XmlSerializer tarafından 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
XmlSerializerkullanılabilmesi için public olması gerekir, ancak veri sözleşmesi modelinde kullanılmak için public olması gerekmez.Şema sağlayıcı yöntemi, veri sözleşmesi modelinde
IsAnytrueolduğunda çağrılır, ancakXmlSerializerile çağrılmaz.XmlRootAttributeöznitelik içerik veya eski veri kümesi türleri için mevcut olmadığında,XmlSerializerboş 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ı
IXmlSerializabletürleri olarak içeri aktarabilirsiniz. Bu içeri aktarma modu varsayılan olarak açık değildir, ancak kolayca etkinleştirilebilir; örneğin,/importXmlTypeskomut satırı ServiceModel Meta Veri Yardımcı Programı Aracı'na (Svcutil.exe) geçiş yaparak. Bu, Sınıf Oluşturmak için Şemayı İçe 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;XmlSerializerkullanma konusuna bakın.Yeni türler oluşturmak yerine var olan
IXmlSerializabletürlerinizi ara sunucu içinde yeniden kullanmak isteyebilirsiniz. Bu durumda, Şemayı Tür Oluşturmak için İçeri Aktarma konusunda anlatılan, atıfta bulunulan türler özelliği, yeniden kullanılacak türü belirtmek için kullanılabilir. Bu, yeniden kullanılacak türleri içeren derlemeyi belirten svcutil.exeüzerindeki/referenceanahtarının kullanılması anlamına 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 derlemeye 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>
Uyumluluk sorunlarıyla karşılaşırsanız, örneğin, XmlSerializer genel olmayan yeni bir geçersiz kılma içeren türetilmiş bir sınıfı seri hale getirememesi gibi, 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>
Uyarı
<xmlSerializer useLegacySerializerGeneration="true"/> yalnızca .NET Framework 4.5 veya daha sonraki bir sürümünü çalıştıran bir makinede çalışır. Yukarıdaki appSettings yaklaşım tüm .NET Framework sürümlerinde çalışır.