2009-06-19 25 views
5

I 3 sınıflarıXmlSerializer.Serialize belirsiz

  • Araç
  • Radyo sahip test uygulaması oluşturması
  • SPORTCAR: Araç (sahip bir Radyo)

serialize işlemi zaman olduğu gibi bir XmlSerializer nesnesinin örneğini oluştur

'i test etmek için 2 nesne kullanıyorum

ve

XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(SportCar), 
    new Type[] { typeof(Car), typeof(Radio) }); 

bu 2 yaklaşımın sonucu aynıdır, bu yüzden 2. yapıcı kullanmak gerekir bu 2 yapıcısı veya kritik nokta arasındaki fark nedir bilmek istiyorum?

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car), 
    new Type[] { typeof(SportCar), typeof(Radio) }); 

Burada, ekstra bilgi olmadan SportCar ya hakkında (sadece Car itibaren) bilinen olmaz eğer örneğin: - Eğer XmlSerializer yaklaşık alt sınıfları anlatmak gerektiğinde

cevap

8

büyük fark olduğunu ya Radio - bunu aslında bir SportCar olan bir nesneyi vermek eğer öyleyse, o başarısız olur:

Car car = new SportCar {...}; 
xmlSerializer.Serialize(destination, car); 

Ayrıca bunu yapabilirsiniz Car tip tanımı karşı [XmlInclude(typeof(SportCar))] ayarı:

[XmlInclude(typeof(SportCar))] 
public class Car {...} 

Bu daha kolaydır, ancak Car tipi yaklaşık SportCar bilen bir montajda ise mümkündür. Ama genellikle bunu biliyorsunuz, bu yüzden XmlInclude tercih edilen seçenektir. Ayrıca, XmlInclude'un bazı verimlilik avantajları vardır; sahne arkasında sistem XmlSerializer verimli yapmak için dinamik tip nesil kullanır. Bu nedenle, genellikle oluşturduğunuz XmlSerializer örneğini tutmanız (ve yeniden kullanmanız) gerekir; örneğin, statik bir alanda depolayarak. Bununla birlikte, sistem varsayılan kullanım için otomatik olarak bunu yapar (new XmlSerializer(typeof(Car))) - yani, bu kurucuyu kaç kez kullanırsanız kullanın, sadece dinamik kodu bir kez üretir. Daha karmaşık bir kurucu kullanırsanız (new XmlSerializer(typeof(Car),new Type[] { typeof(SportCar), typeof(Radio) })), her seferinde tür nesli gerçekleştirir.

+0

Alt sınıf bilgilerini belirtirsem çıkıştaki fark nedir? (Serileştirme işleminde yeniyim) – Anonymous

+1

XmlInclude yaklaşımı ile yapıcı (yeni Tip []) yaklaşımı arasında çıkışta fark yoktur; eşdeğerdirler. Ne yaparsanız yapın ve bir XmlSerializer (typeof (Car)) isteyin, ancak bir SportCar verin - bir istisna atar. –

+0

Gördüğünüz gibi, C# 3.0 hakkında XmlSerializer ile ilgili başlıkları özetledikten sonra ve "alt sınıflar hakkında" bahseden cevabınızı okumak için geri döndüğümde XmlSerializer'ın nasıl çalıştığını anladım. (C# üzerinde çalışmak için başka bir kitap satın alıyorum, çok kötü.) – Anonymous