2009-12-01 25 views
6

olarak serileştirmek için Yalnızca temel bir sınıfa yöntem ekleyen türetilmiş bir sınıfa sahibim. Türetilmiş sınıfı, temel sınıfın serileştirmesiyle eşleşecek şekilde nasıl serileştirebilir? yani türetilmiş sınıf seri XML gibi görünmelidir:Türetilmiş bir sınıfı, temel sınıf

<BaseClass> 
    ... 
</BaseClass> 

ör Aşağıdakiler bir InvalidOperationException atar "TüretilmişClass türü beklenmiyor. Statik olarak bilinmeyen türleri belirtmek için XmlInclude veya SoapInclude özniteliğini kullanın."

Class BaseClass {} 

Class DerivedClass : BaseClass {} 

DerivedClass derived = new DerivedClass(); 

StreamWriter stream = new StreamWriter("output file path"); 
XmlSerializer serializer = new XmlSerializer(GetType(BaseClass)); 
serializer(stream, derived); 

cevap

4

Diziselleştirici yapıcısına GetType (DerivedClass) öğesini iletmeniz gerekecek, serileştirdiğiniz nesnenin türüyle eşleşmelidir. Kök öğesine yeniden adlandırmak için <XmlRoot> özniteliğini kullanabilirsiniz. Biraz daha kodu gerekir ve temel sınıf için IXmlSerializable uygulamak, sanal olarak tüm metodları beyan ve bunları geçersiz kılma edeceğiz söyleyebiliriz); googling birazcık sonra

using System; 
using System.Xml.Serialization; 
using System.IO; 

class Program { 
    static void Main(string[] args) { 
    var obj = new DerivedClass(); 
    obj.Prop = 42; 
    var xs = new XmlSerializer(typeof(DerivedClass)); 
    var sw = new StringWriter(); 
    xs.Serialize(sw, obj); 
    Console.WriteLine(sw.ToString()); 

    var sr = new StringReader(sw.ToString()); 
    var obj2 = (BaseClass)xs.Deserialize(sr); 
    Console.ReadLine(); 
    } 
} 

public class BaseClass { 
    public int Prop { get; set; } 
} 
[XmlRoot("BaseClass")] 
public class DerivedClass : BaseClass { } 
+0

iş yapıyor, teşekkürler. –

+0

Çocuklar, ben de aynı problemi yaşıyorum ama bu işe yaramadı. Base sınıfım bir XSD'den yaratıldı, bu yüzden [XmlRoot] 'da ne yazacağımı bilmiyorum, sınıfın adı veya temel sınıftaki kök elemanın adıdır (isim ismini belirtmeliydim, vs vs?) – Tejo

+1

Sadece tabanın türetilmiş türden değil bilinmesi durumunda bir çözüm var mı? –

0

Denemedim, ancak atmayı başaramaz mısınız?

serializer(stream, (BaseClass)derived); 

Düzenleme Ayrıca

, birden türetilmiş sınıfları & taban sınıfı ile başa çıkabilir tek XmlSerialiser yapmak istiyorsanız o zaman XmlSerialiser yapıcı içinde türleri belirtmek gerekir.

XmlSerializer serializer = new XmlSerializer(typeof(BaseClass), new Type[] {typeof(DerivedClass)}); 

Daha sonra birden çok türü seri hale getirecektir. Ancak, çıkış xml'in sınıflar arasında eşleşmesi için yukarıda belirtilen çözümü de kullanmanız gerekecektir.

+1

Aynı InceptionOperationException atılıyor –

0

: Bu örnek kod amaçlanan olarak çalıştı türetilmiş sınıfta. Burada belirtilen bir arayüzle çözümlenmiş bir topic ve similar problem örneğidir.

var sw = new StringWriter() 

var base = (derived as BaseClass).Clone() 
var serializer = new XmlSerializer(typeof(BaseClass)) 
serializer.Serialize(sw, base) 

Console.WriteLine(sw.ToString()) 

Değil mükemmel Approche ancak temel sınıf basitse o zaman da çalışması gerekir:

1

Ayrıca o BaseClass için ICloneable arabirimini uygulayabilir ve böylece yapmak.

İlgili konular