Aracılığıyla paylaş


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 XmlElementAttributeveya 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 DataContractSerializertam 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üyor null ve özniteliğindeki IsAny özelliği varsayılan değerinde falsebırakılır. Bu, türlerin en yaygın kullanımıdır IXmlSerializable .

  • 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ı XmlSchemaProviderAttributeyerine belirtebilirsiniznull. Ancak, ise ve bir şema sağlayıcısı yöntemi belirtilirse IsAnytrue , yöntemi döndürmelidir null.

  • 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çin DataSet 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ürlerinize IXmlSerializable 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 XmlSchemaSettü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 nullbir öğ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 öğeyi WriteXml 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, veya NetDataContractSerializer oluşturucularında seri hale getirici oluşturulurken açıkça bir kök adı ve ad alanı belirtilmediği sürece, seri hale getirici DataContractSerializer normalde yazan öğenin WriteXml ç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 atanamaz null ve atanamaz. Ayrıca nesne grafı koruması etkinleştirilemez ve NetDataContractSerializer 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ı verifyObjectNametrue olduğundan, nesneyi gerçekten okumadan önce olduğu gibi IsStartObject davranır. ReadObject ardından denetimi yöntemine ReadXml 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 XmlSerializerkullanı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 IsAnytrue çağrılır ancak ile çağrılmaz XmlSerializer.

  • 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 konusuna XmlSerializerbakı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.

Ayrıca bkz.