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ştirme 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.
Not
XML serileştirme yöntemleri, Dizinleyicileri, özel alanları veya salt okunur özelliklerini (dışında salt okunur koleksiyonlar) dönüştürmez. Bir nesnenin tüm alanları ve özellikleri serileştirmek için ve ortak ve özel, kullanın DataContractSerializer XML serileştirme yerine.
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ı oluşturur ve bunları bu serileştirme gerçekleştirmek için .dll dosyalarıyla 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 başlıklı belge ile uyumludur "XML şema bölüm 2: veri türleri."
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. Bu tür bir sınıfının bir örneğini serileştirilmiş olduğunda, oluşturulan XML için XML Şeması uyar. Bu tür bir sınıf ile programlayabileceğiniz sağlanan kolay yönetilebilen nesne modeli olan sırasında oluşturulan XML XML şemaya uygun olduğunu garanti. 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. BIR XML Web hizmeti değişmez veya kodlanmış SOAP stilini kullanabileceğinden, "XML Serileştirmesini Denetleen Öznitelikler" ve "Kodlanmış SOAP Serileştirmesini Denetleen Ö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 hususları
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.
Not
Bu seri hale getirme derlemeler önceden oluşturulur ve SGen.exe aracını kullanarak oturum açmış. Bu, Web hizmetleri sunucusunda çalışmaz. Diğer bir deyişle, yalnızca istemci kullanımı için ve el ile serileştirme içindir.
Kod ve DLL'leri oluşturma ve derleme sırasındaki kötü amaçlı bir işleme etkilenir. İ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ı derlenmiş olup .cs veya .dll dosya değiştirerek bilgisayarın güvenlik ihlal. Bu sorunu gidermek için her zaman her bilgisayar hesabında kendi profili sahip olduğundan emin olun. Varsayılan olarak, her hesap için farklı bir dizin TEMP ortam değişkeni gösteriyor.
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 bilgisayara kullandığınız ve uygulamanızı IIS içinde çalışıyorsa bu tür bir saldırıya ortadan kaldırıldı. 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 nesne bir iş parçacığı sayısını gösterir 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 verileri açık 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, bir uygulama oluşturursanız, siparişler serileştiren kredi kartı numaraları dahil, veri yüksek oranda duyarlıdır. Bunu önlemek için her zaman için veri deposu korumak ve özel olarak saklamak için adımları izleyin.
Basit bir sınıfın seri hale getirme
Aşağıdaki kod örneğinde, ortak bir alanla 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 örneğini serileştirilmiş olduğunda, aşağıdakine benzer.
<OrderForm>
<OrderDate>12/12/01</OrderDate>
</OrderForm>
Daha fazla serileştirme örneği için bkz . XML Serileştirme Örnekleri.
Seri hale öğeleri
Aşağıdaki öğeler XmlSerializer sınıfı kullanılarak seri hale getirilebilir:
Ortak okuma/yazma özellikleri ve ortak sınıfların alanları.
ICollection veya IEnumerable uygulayan sınıflar.
Not
Yalnızca koleksiyonları serileştirilmiş, ortak değil Özellikleri ' dir.
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 Serialization kullanarak 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.
Kullanmak için bir XML ad alanı 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. Books tanımlamak için kullanılan bir şema düşünün. Bir başlık özelliklerini, yazarın, yayımcı ve ISBN öğe sayısı. Örneğin, bir kitap düzeni veya books envanterini olarak istediğiniz herhangi bir şekilde XML verileri işleyen bir uygulama geliştirebilirsiniz. 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ştirme konuları
XmlSerializer sınıfı kullanılırken aşağıdakiler dikkate alınmalıdır:
Sgen.exe aracı açıkça en iyi performans için serileştirme derlemelerini oluşturmak üzere tasarlanmıştır.
Serileştirilmiş veriler yalnızca verilerin kendisini ve sınıflarınızın yapısını içerir. Türü kimlik ve derleme bilgiler dahil değildir.
Yalnızca genel özelliklerini ve alanları seri hale getirilebilir. Özellikler ortak erişimciler olmalıdır (almanıza ve ayarlamanıza yöntemleri). Genel olmayan verileri seri gerekir, kullanın DataContractSerializer sınıfının XML serileştirme değil.
Bir sınıfın XmlSerializer tarafından seri hale getirilecek parametresiz oluşturucuya sahip olması gerekir.
Yöntemleri seri hale getirilemiyor.
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ü. Böyle 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, dize türü ü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: