Aracılığıyla paylaş


XML serileştirme

Serileştirme, bir nesneyi kolayca taşınabilen bir forma dönüştürme işlemidir. Örneğin, bir nesneyi seri hale getirebilirsiniz ve istemci ile sunucu arasında HTTP kullanarak İnternet üzerinden taşıyabilirsiniz. Diğer uçta seri durumdan çıkarma, nesneyi akıştan yeniden oluşturur.

XML serileştirme, bir nesnenin yalnızca ortak alanlarını ve özellik değerlerini XML akışında serileştirir. XML serileştirmesi tür bilgilerini içermez. Örneğin, Kitaplık ad alanında bulunan bir Book nesneniz varsa, aynı türde bir nesnede seri durumdan çıkarıldığının garantisi yoktur.

Uyarı

XML serileştirme yöntemleri, dizin oluşturucuları, özel alanları veya salt okunur özellikleri (salt okunur koleksiyonlar dışında) dönüştürmez. Bir nesnenin hem ortak hem de özel tüm alanlarını ve özelliklerini serileştirmek için XML serileştirmesi yerine öğesini DataContractSerializer kullanın.

XML serileştirmesindeki merkezi sınıf sınıfıdır XmlSerializer ve bu sınıftaki en önemli yöntemler Seri Hale Getirme ve Seri Durumdan Çıkarma yöntemleridir. XmlSerializer C# dosyalarını oluşturur ve bu serileştirmeyi gerçekleştirmek için onları .dll dosyalarına derler. XML Seri Hale Getirici Oluşturucu Aracı (Sgen.exe), uygulamanızla dağıtılacak bu serileştirme derlemelerini önceden oluşturacak ve başlatma performansını geliştirecek şekilde tasarlanmıştır. XmlSerializer tarafından oluşturulan XML akışı, World Wide Web Consortium (W3C) XML Şeması tanım dili (XSD) 1.0 önerisiyle uyumludur. Ayrıca, oluşturulan veri türleri "XML Şema Bölüm 2: Veri Türleri" başlıklı belgeyle uyumludur.

Nesnelerinizdeki veriler sınıflar, alanlar, özellikler, ilkel türler, diziler ve hatta XmlElement veya XmlAttribute nesneleri biçiminde eklenmiş XML gibi programlama dili yapıları kullanılarak açıklanmıştır. Kendi sınıflarınızı oluşturma, özniteliklerle açıklama ekleme veya XML Şema Tanımı aracını kullanarak mevcut XML Şemasını temel alan sınıfları oluşturma seçeneğiniz vardır.

XML Şemanız varsa, şemaya kesin olarak yazılan ve özniteliklerle açıklama ekleyen bir sınıf kümesi oluşturmak için XML Şema Tanımı aracını çalıştırabilirsiniz. Böyle bir sınıfın örneği seri hale getirildiğinde, oluşturulan XML XML Şemasına bağlıdır. Böyle bir sınıfla birlikte, oluşturulan XML'nin XML şemasına uygun olduğundan emin olurken kolayca işlenen bir nesne modeline karşı programlayabilirsiniz. Bu, XML akışını ayrıştırmak ve yazmak için .NET'te XmlReader ve XmlWriter sınıfları gibi diğer sınıfları kullanmaya alternatiftir. Daha fazla bilgi için bkz. XML Belgeleri ve Verileri. Bu sınıflar herhangi bir XML akışını ayrıştırmanıza olanak sağlar. Buna karşılık, XML akışının bilinen bir XML Şemasına uyması beklendiğinde XmlSerializer'ı kullanın.

Öznitelikler XmlSerializer sınıfı tarafından oluşturulan XML akışını denetleyerek XML akışının XML ad alanını, öğe adını, öznitelik adını vb. ayarlamanıza olanak sağlar. Bu öznitelikler ve XML serileştirmesini nasıl denetledikleri hakkında daha fazla bilgi için bkz. Öznitelikleri Kullanarak XML Serileştirmesini Denetleme. Oluşturulan XML'yi denetlemek için kullanılan bu özniteliklerin tablosu için bkz. XML Serileştirmesini Denetleyen Öznitelikler.

XmlSerializer sınıfı bir nesneyi daha fazla seri hale getirerek kodlanmış bir SOAP XML akışı oluşturabilir. Oluşturulan XML, World Wide Web Konsorsiyumu belgesinin "Basit Nesne Erişim Protokolü (SOAP) 1.1" başlıklı 5. bölümüne bağlıdır. Bu işlem hakkında daha fazla bilgi için bkz . How to: Serialize an Object as a SOAP-Encoded XML Stream. Oluşturulan XML'yi denetleen özniteliklerin tablosu için bkz. Kodlanmış SOAP Serileştirmesini Denetleen Öznitelikler.

XmlSerializer sınıfı, XML Web hizmetleri tarafından oluşturulan ve bu hizmetlere geçirilen SOAP iletilerini oluşturur. SOAP iletilerini denetlemek için sınıflara öznitelikler uygulayabilir, XML Web hizmeti dosyasında (.asmx) bulunan değerleri, parametreleri ve alanları döndürebilirsiniz. XML Web hizmeti değişmez veya kodlanmış SOAP stilini kullanabileceği için, "XML Serileştirmesini Denetleyen Öznitelikler" ve "Kodlanmış SOAP Serileştirmesini Denetleyen Öznitelikler" içinde listelenen öznitelikleri kullanabilirsiniz. Xml Web hizmeti tarafından oluşturulan XML'yi denetlemek için öznitelikleri kullanma hakkında daha fazla bilgi için bkz. XML Web Hizmetleri ile XML Serileştirme. SOAP ve XML Web hizmetleri hakkında daha fazla bilgi için bkz. SOAP İleti Biçimlendirmesini Özelleştirme.

XmlSerializer Uygulamaları için Güvenlik Konuları

XmlSerializer kullanan bir uygulama oluştururken aşağıdaki öğelere ve bunların etkilerine dikkat edin:

  • XmlSerializer C# (.cs) dosyaları oluşturur ve bunları TEMP ortam değişkeni tarafından adlandırılan dizindeki .dll dosyalarına derler; serileştirme bu DLL'lerle gerçekleşir.

    Uyarı

    Bu serileştirme derlemeleri önceden oluşturulabilir ve SGen.exe aracı kullanılarak imzalanabilir. Bu, Web hizmetleri sunucusunda çalışmaz. Başka bir deyişle, yalnızca istemci kullanımı ve el ile serileştirme içindir.

    Kod ve DLL'ler oluşturma ve derleme sırasında kötü amaçlı bir işleme karşı savunmasızdır. İki veya daha fazla kullanıcının TEMP dizinini paylaşması mümkün olabilir. İki hesabın farklı güvenlik ayrıcalıklarına sahip olması ve yüksek ayrıcalıklı hesabın XmlSerializer kullanarak bir uygulama çalıştırması durumunda TEMP dizininin paylaşılması tehlikelidir. Bu durumda, bir kullanıcı derlenen .cs veya .dll dosyasını değiştirerek bilgisayarın güvenliğini ihlal edebilir. Bu endişeyi ortadan kaldırmak için, bilgisayardaki her hesabın kendi profili olduğundan emin olun. Varsayılan olarak, TEMP ortam değişkeni her hesap için farklı bir dizine işaret etti.

  • Kötü amaçlı bir kullanıcı web sunucusuna sürekli XML veri akışı gönderirse (hizmet reddi saldırısı), bilgisayar kaynakları yetersiz olana kadar XmlSerializer verileri işlemeye devam eder.

    Internet Information Services (IIS) çalıştıran bir bilgisayar kullanıyorsanız ve uygulamanız IIS içinde çalışıyorsa bu tür bir saldırı ortadan kalkar. IIS, belirli bir miktardan daha uzun akışları işlemeyen bir geçit içerir (varsayılan değer 4 KB'tır). IIS kullanmayan ve XmlSerializer ile seri durumdan çıkaran bir uygulama oluşturursanız, hizmet reddi saldırısını önleyen benzer bir kapı uygulamanız gerekir.

  • XmlSerializer verileri serileştirir ve verilen herhangi bir türü kullanarak herhangi bir kodu çalıştırır.

    Kötü amaçlı bir nesnenin tehdit oluşturmanın iki yolu vardır. Kötü amaçlı kod çalıştırabilir veya XmlSerializer tarafından oluşturulan C# dosyasına kötü amaçlı kod ekler. İkinci durumda, kötü amaçlı bir nesnenin XmlSerializer tarafından oluşturulan C# dosyasına bir şekilde kod ekleyebileceği teorik bir olasılık vardır. Bu sorun ayrıntılı bir şekilde incelense de ve böyle bir saldırının olası olmadığını kabul etse de, bilinmeyen ve güvenilmeyen bir türe sahip verileri asla seri hale getirmeme önlemini almanız gerekir.

  • Serileştirilmiş hassas veriler savunmasız olabilir.

    XmlSerializer verileri seri hale getirdikten sonra, bir XML dosyası veya başka bir veri deposu olarak depolanabilir. Veri deponuz diğer işlemler için kullanılabiliyorsa veya intranette veya İnternet'te görünüyorsa, veriler çalınabilir ve kötü amaçlı olarak kullanılabilir. Örneğin, kredi kartı numaralarını içeren siparişleri seri hale getiren bir uygulama oluşturursanız veriler son derece hassastır. Bu durumu önlemeye yardımcı olmak için, verilerinizin depolandığı yeri her zaman koruyun ve kişisel verilerinizi gizli tutmak için önlemler alın.

Basit Bir Sınıfın Seri Hale Getirilmesi

Aşağıdaki kod örneği, ortak alana sahip temel bir sınıfı gösterir.

Public Class OrderForm
    Public OrderDate As DateTime
End Class
public class OrderForm
{
    public DateTime OrderDate;
}

Bu sınıfın bir örneği seri hale getirildiğinde aşağıdakine benzer olabilir.

<OrderForm>
    <OrderDate>12/12/01</OrderDate>
</OrderForm>

Daha fazla serileştirme örneği için bkz. XML Serileştirme Örnekleri.

Serileştirilebilen öğeler

Aşağıdaki öğeler XmlSerializer sınıfı kullanılarak seri hale getirilebilir:

  • Halk sınıfların genel okuma/yazma özellikleri ve alanları.

  • ICollection veya IEnumerable uygulayan sınıflar.

    Uyarı

    Yalnızca koleksiyonlar serileştirilir, genel özellikler serileştirilmez.

  • XmlElement nesneleri.

  • XmlNode nesneleri.

  • DataSet nesneleri.

Nesneleri seri hale getirme veya seri durumdan çıkarma hakkında daha fazla bilgi için bkz . How to: Serialize an Object and How to: Deserialize an Object.

XML Serileştirme kullanmanın avantajları

XmlSerializer sınıfı, bir nesneyi XML olarak seri hale getirdiğinizde tam ve esnek denetim sağlar. XML Web hizmeti oluşturuyorsanız, XML çıkışının belirli bir şemaya uygun olduğundan emin olmak için sınıflara ve üyelere serileştirmeyi denetleyan öznitelikler uygulayabilirsiniz.

Örneğin, XmlSerializer şunları sağlar:

  • Bir alanın veya özelliğin öznitelik veya öğe olarak kodlanıp kodlanmayacağını belirtin.

  • Kullanılacak XML ad alanını belirtin.

  • Alan veya özellik adı uygun değilse öğenin veya özniteliğin adını belirtin.

XML serileştirmenin bir diğer avantajı, oluşturulan XML akışı belirli bir şemaya uygun olduğu sürece, geliştirdiğiniz uygulamalarda hiçbir kısıtlama olmamasıdır. Kitapları açıklamak için kullanılan bir şema düşünün. Bir başlık, yazar, yayımcı ve ISBN sayı öğesi içerir. XML verilerini istediğiniz şekilde işleyen bir uygulama geliştirebilirsiniz; örneğin, kitap siparişi olarak veya kitap envanteri olarak. Her iki durumda da tek gereksinim, XML akışının belirtilen XML Şeması tanım dili (XSD) şemasına uygun olmasıdır.

XML Serileştirmeyle İlgili Dikkat Edilmesi Gerekenler

XmlSerializer sınıfı kullanılırken aşağıdakiler dikkate alınmalıdır:

  • Sgen.exe aracı, en iyi performans için serileştirme derlemeleri oluşturmak üzere açıkça tasarlanmıştır.

  • Serileştirilmiş veriler yalnızca verilerin kendisini ve sınıflarınızın yapısını içerir. Tür kimliği ve derleme bilgileri dahil değildir.

  • Yalnızca genel özellikler ve alanlar seri hale getirilebilir. Özelliklerin ortak erişimcileri olmalıdır (get ve set yöntemleri). Genel olmayan verileri seri hale getirmeniz gerekiyorsa, XML serileştirmesi yerine sınıfını DataContractSerializer kullanın.

  • Bir sınıfın XmlSerializer tarafından seri hale getirilecek parametresiz oluşturucuya sahip olması gerekir.

  • Yöntemler serileştirilemez.

  • XmlSerializer , aşağıdaki gibi belirli gereksinimleri karşılıyorsa IEnumerable veya ICollection uygulayan sınıfları farklı şekilde işleyebilir.

    IEnumerable uygulayan bir sınıf, tek bir parametre alan bir genel Add yöntemi uygulamalıdır. Add yönteminin parametresi, GetEnumerator yönteminden döndürülen IEnumerator.Current özelliğinden döndürülen türle tutarlı (polimorfik) olmalıdır.

    IEnumerable'a (CollectionBase gibi) ek olarak ICollection uygulayan bir sınıfın, tamsayı alan genel Öğe dizinli özelliği (C#'de dizin oluşturucu) olması ve tamsayı türünde genel count özelliğine sahip olması gerekir. Add yöntemine geçirilen parametre, Item özelliğinden döndürülen türle veya bu türün temellerinden biriyle aynı türde olmalıdır.

    ICollection uygulayan sınıflar için, serileştirilecek değerler GetEnumerator çağrılarak değil dizine alınan Item özelliğinden alınır. Ayrıca, başka bir koleksiyon sınıfı döndüren ortak alanlar ( ICollection uygulayan bir tane) dışında ortak alanlar ve özellikler serileştirilmemiştir. Bir örnek için bkz. XML Serileştirme Örnekleri.

XSD Veri Türü Eşlemesi

XML Şeması Bölüm 2: Veri Türleri başlıklı W3C belgesi, XML Şeması tanım dili (XSD) şemasında izin verilen basit veri türlerini belirtir. Bunların birçoğu için (örneğin, int ve ondalık), .NET'te buna karşılık gelen bir veri türü vardır. Ancak, bazı XML veri türlerinin karşılık gelen bir .NET veri türü yoktur, örneğin NMTOKEN veri türü. Bu gibi durumlarda, bir şemadan sınıf oluşturmak için XML Şema Tanımı aracını (XML Şema Tanımı Aracı (Xsd.exe)) kullanırsanız, tür dizesinin üyesine uygun bir öznitelik uygulanır ve DataType özelliği XML veri türü adına ayarlanır. Örneğin, şema NMTOKEN XML veri türüne sahip "MyToken" adlı bir öğe içeriyorsa, oluşturulan sınıf aşağıdaki örnekte gösterildiği gibi bir üye içerebilir.

<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;

Benzer şekilde, belirli bir XML Şemasına (XSD) uyması gereken bir sınıf oluşturuyorsanız, uygun özniteliği uygulamalı ve DataType özelliğini istenen XML veri türü adına ayarlamalısınız.

Tür eşlemelerinin tam listesi için aşağıdaki öznitelik sınıflarından herhangi birinin DataType özelliğine bakın:

Ayrıca bakınız