XML serileştirme
Serileştirme, bir nesneyi, taşımaya hazır bir forma dönüştürme işlemidir. Örneğin, bir nesneyi seri hale getirebilirsiniz ve bir istemci ile sunucu arasında HTTP kullanarak İnternet üzerinden taşıma. Diğer taraftan, deserialization nesnesi akıştan yeniden oluşturur.
XML serileştirmesi, bir nesnenin yalnızca ortak alanlarını ve özellik değerlerini bir XML akışında seri hale getirme. XML serileştirme türü bilgilerini içermez. Örneğin, Kitaplık ad alanı içinde var olan bir Kitap nesne varsa, aynı türde bir nesnede bunun için deserialized garanti 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ştirmede merkezi sınıf sınıfıdır ve bu sınıftaki en önemli yöntemler XmlSerializer Serialize ve Deserialize yöntemleridir. XmlSerializer C# dosyaları oluşturur ve bunları bu serileştirme gerçekleştirmek için .dll dosyalarıyla derler. Bu XML Serileştiricisi Oluşturma Aracı (Sgen.exe), bu serileştirme derlemelerini uygulamanıza dağıtılacak şekilde önceden oluşturmak ve başlatma performansını geliştirmek için tasarlanmıştır. XmlSerializer tarafından oluşturulan XML akışı, World Wide Web Konsorsiyumu (W3C) XML Şeması tanımlama 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."
Nesnelerinizin verileri; sınıflar, alanlar, özellikler, ilkel türler, diziler ve hatta XmlElement veya XmlAttribute nesneleri biçiminde katıştırılmış XML gibi programlama dili yapıları kullanılarak açıklanmıştır. Özniteliklerle açıklamalı olarak kendi sınıflarınızı oluşturma veya xml şema tanımı aracını kullanarak sınıfları mevcut bir XML Şemasını temel alarak oluşturma seçeneğiniz vardır.
Bir XML Şemasına sahipsiniz, şemaya kesin olarak yazarak özniteliklerle açıklama ek açıklama ekli sınıflar üretmek 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, bir XML akışını ayrıştırmak ve yazmak için .NET'te XmlReader ve XmlWriter sınıfları gibi diğer sınıfların kullanımına alternatiftir. Daha fazla bilgi için bkz. XML Belgeleri ve Verileri. Bu sınıflar herhangi bir XML akışını ayrıştırmaya olanak sağlar. Buna karşılık, XML akışının bilinen bir XML Şemasına uyması beklendiğinde XmlSerializer kullanın.
Öznitelikler, XML akışının XML ad alanını, öğe adını, öznitelik adını ve diğer özelliklerini ayarlamanıza olanak sağlayarak XmlSerializer sınıfı tarafından oluşturulan XML akışını kontrol altına almaktadır. Bu öznitelikler ve XML serileştirmesini denetleme hakkında daha fazla bilgi için bkz. Öznitelikleri Kullanarak XML Serileştirmesini Denetleme. Oluşturulan XML'yi kontrol etmek için kullanılan özniteliklerin bir tablosu için bkz. XML Serileştirmesini Kontrol Eden Öznitelikler.
XmlSerializer sınıfı bir nesneyi daha fazla seri hale getirebilirsiniz ve kodlanmış bir SOAP XML akışı oluşturur. Oluşturulan XML "Basit Nesne Erişim Protokolü (SOAP) 1.1." başlıklı bölümüne World Wide Web Consortium belgesinin 5 uyar 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 kontrol altına alan özniteliklerin bir tablosu için bkz. Kodlanmış SOAP Serileştirmesini KontrolLayan Öznitelikler.
XmlSerializer sınıfı tarafından oluşturulan ve XML Web hizmetlerine geçirilen SOAP iletilerini üretir. SOAP iletilerini kontrol etmek için sınıflara öznitelikler uygulayabilir, xml Web hizmeti dosyasında (.asmx) bulunan değerler, parametreler ve alanlar getirebilirsiniz. XML Web hizmeti değişmez veya kodlanmış SOAP stilini kullanabileceği için, "XML Serileştirmesini KontrolLayan Öznitelikler" ve "Kodlanmış SOAP Serileştirmesini KontrolLayan Öznitelikler" içinde listelenen her iki özniteliği de kullanabilirsiniz. Bir XML Web hizmeti tarafından oluşturulan XML'yi denetleme özniteliklerini 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 öğelerin ve etkilerinin farkında olur:
XmlSerializer C# (.cs) dosyaları oluşturur ve TEMP ortam .dll tarafından adlı dizinde yeni dosyalarda derler; serileştirme bu URL'lerle gerçekleşir.
Not
Bu seri hale getirme derlemeler önceden oluşturulur ve SGen.exe aracını kullanarak oturum açmış. Bu, Web hizmetlerinin bir sunucusunda çalışmıyor. 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ı varsa ve yüksek ayrıcalıklı hesap XmlSerializer kullanarak bir uygulama çalıştırıyorsa TEMP dizininin paylaşımı 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 bir XML veri akışı (hizmet reddi saldırısı) gönderirse, XmlSerializer bilgisayar kaynakları az çalışana kadar 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, akışları belirli bir miktardan (varsayılan değer 4 KB) daha uzun işlemeyen bir geçit içerir. IIS kullanmayan ve XmlSerializer ile deserializes bir uygulama sanız, hizmet reddi saldırısını engelleyen benzer bir geçit uygulamanız gerekir.
XmlSerializer verileri seri hale getirme ve verilen herhangi bir türü kullanarak herhangi bir kod ç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 da abilir. İkinci durumda, kötü amaçlı bir nesnenin XmlSerializer tarafından oluşturulan C# dosyasına bir şekilde kod ekleme olasılığı vardır. Bu sorun kapsamlı bir şekilde incelendiğinden ve böyle bir saldırının olası olarak kabul edilmese de, bilinmeyen ve güvenilmeyen bir türle verileri hiçbir zaman seri hale getirmeme önlemi almalıdır.
Serileştirilmiş hassas verileri açık olabilir.
XmlSerializer verileri seri hale getirdikten sonra bir XML dosyası veya başka bir veri deposu olarak depolanmış olabilir. Veri deponız başka işlemler için kullanılabilirse veya bir intranette veya İnternet'te görünüyorsa, veriler çalınarak 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>
Serileştirmeye daha fazla örnek için bkz. XML Serileştirme Örnekleri.
Seri hale öğeleri
Aşağıdaki öğeler XmlSerializer sınıfı kullanılarak seri hale getirebilirsiniz:
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 seriden getirme hakkında daha fazla bilgi için, bkz. How to: Serialize an Object ve How to: Deserialize an Object.
XML Serialization kullanarak avantajları
XmlSerializer sınıfı, bir nesneyi XML olarak seri hale getirebilirsiniz. Bir 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 kontrol altına alan öznitelikler uygulayabilirsiniz.
Örneğin, XmlSerializer şunları sağlar:
Bir alanın veya özelliğin öznitelik veya öğe olarak kodlanması gerekip gerek olmadığını belirtin.
Kullanmak için bir XML ad alanı belirtin.
Bir alan veya özellik adı uygun olmayan bir öğe veya özniteliğin adını belirtin.
XML serileştirmenin bir diğer avantajı da, oluşturulan XML akışının verilen şemaya uygun olduğu sürece geliştirdiğimiz uygulamalar üzerinde herhangi bir kısıtlamaya sahip olmadığınızdı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ı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 bir oluşturucusu olmalıdır.
Yöntemleri seri hale getirilemiyor.
XmlSerializer, belirli gereksinimleri karşılarsa IEnumerable veya ICollection uygulayan sınıfları aşağıdaki gibi farklı işlenebilir.
IEnumerable uygulayan bir sınıf, tek bir parametre alan genel bir Add yöntemi uygulamalı. Add yönteminin parametresi, GetEnumerator yönteminden döndürülen IEnumerator.Current özelliğinden döndürülen türle tutarlı (çok biçimli) olmalıdır.
IEnumerable'a (CollectionBase gibi) ek olarak ICollection uygulayan bir sınıfın, tamsayı alan bir genel Item dizinli özelliğine (C# içinde dizin oluşturma) sahip olması ve tamsayı türünde bir genel Count özelliğine sahip olması gerekir. Add yöntemine geçirilen parametre, Item özelliğinden döndürülen türle aynı türde veya bu türün temellerinden biri olmalıdır.
ICollection uygulayan sınıflar için, seri hale getirilecek 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ı (ICollection uygulayan bir sınıf) dönüşen genel alanlar dışında genel alanlar ve özellikler seri hale getirilmeyecektir. Bir örnek için bkz. XML Serileştirme Örnekleri.
XSD veri türü eşlemesi
XML Şeması Bölüm 2: Datatypes başlıklı W3C belgesi, bir XML Şeması tanımlama dili (XSD) şemasında izin verilen basit veri türlerini belirtir. Bunların çoğu için (örneğin, int ve ondalık),.NET'te karşılık gelen bir veri türü var. Ancak, bazı XML veri türlerinin karşılık gelen bir .NET veri türü (örneğin, NMTOKEN veri türü) yok. Böyle durumlarda, bir şemadan sınıf oluşturmak için XML Şema Tanımı aracı (XML Şema Tanımı Aracı (Xsd.exe) )kullanırsanız, tür dizesinin bir üyesine uygun bir öznitelik uygulanır ve DataType özelliği XML veri türü adına ayarlanır. Örneğin, bir ş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 ayarlayabilirsiniz.
Tür eşlemelerinin tam listesi için, aşağıdaki öznitelik sınıflarının herhangi biri için DataType özelliğine bakın: