2012-02-29 12 views
6

ile Object türünde özelliği seri hale getirmek nasıl bir özelliği vardır. Ama nesneyi bu özellik ile seri hale getirdiğimde, serileştirilmiyor. XmlSerializer'a olası tipler vermenin bir yolu var mı?XmlSerializer

+0

Sana ISerializable uygulayan ve seri hale kontrol edebilecek beklediğiniz her durumda sizin öğe adı <Tag> tutabilir Nesne, türüne göre türüne göre etiketleme türüne göre değişir. Ancak, daha sonra nesneyi nasıl deserialize edeceğinizi bilmiyorum. Yazı tipi nesnelerini serileştirmek iyi bir fikir olmayabilir. –

+1

@Adrian 'XmlSerializer'' ISerializable' ile ilgilenmez; Bununla birlikte, bu senaryoyu en iyi şekilde kullanacağımızdan emin olduğumu kabul ediyorum –

+0

@Marc XmlSerializer ISerialiable'ı önemsemiyor ancak IXmlSerializable'ı önemsiyor ve bunu uygulayan bir nesne üzerinde okuma ve yazma yöntemlerini çağırıyor. – Fen

cevap

9

Bunu önermiyoruz ama evet, bir üye için birden aday türleri hakkında gerçekleri anlatmak [XmlElement] vb kullanabilirsiniz:

public class Test 
{ 
    private static void Main() 
    { 
     var ser = new XmlSerializer(typeof (Test)); 
     var obj = new Test {Value = "abc"}; 
     ser.Serialize(Console.Out, obj); 
     obj = new Test { Value = 123 }; 
     ser.Serialize(Console.Out, obj); 
     obj = new Test { Value = 456.7F }; 
     ser.Serialize(Console.Out, obj); 
    } 

    [XmlElement("a", Type = typeof(int))] 
    [XmlElement("b", Type = typeof(string))] 
    [XmlElement("c", Type = typeof(float))] 
    public object Value { get; set; } 
} 

çıkışının önemli bit (bütün xmlns/<?xml> görmezden vs) şunlardır:

<Test> 
    <b>abc</b> 
</Test> 

<Test> 
    <a>123</a> 
</Test> 

<Test> 
    <c>456.7</c> 
</Test> 
+0

Mükemmel çalışıyor! – user919426

+0

Bu, yalnızca elemanlar için farklı adlar veya ad alanları kullanmanız durumunda çalışır (bu örnekte a, b, c). Benim durumumda, her zaman aynı olması için eleman ismine ihtiyacım vardı, bu yüzden benim için işe yarayacak bir cevap gönderdim. – Evan

0

Ben bir unsur niteliği olarak nesne türünü yazma, IXmlSerializable arabirimini uygulayan yaptı. Not: Kodda ad alanı ve ASCII kodlaması kullanmıyorum, bunlar zorunlu olmayan seçimlerdir.

HTH, Cabbi

0

Ayrıca nesne özelliği içeren sınıfa üzerinde [XmlInclude(typeof(YourType))] kullanabilirsiniz. OP durumunda Yani, bu

[XmlInclude(typeof(PossibleClassOne))] 
[XmlInclude(typeof(PossibleClassTwo))] 
public class MyClass 
{ 
    public object Tag { get; set; } 
} 

Bu şekilde görünecektir, sen

İlgili konular