2012-05-09 9 views
2

この動作を回避しようとしているオンラインの人々を見つけることができるようですが、私が望む動作を得ることができません。リストをシリアル化<T>親タグを持つ基本クラス

この動作を得るために、私は動物のリストを持っていると私はそれぞれの動物の種類ごとに異なるタグでそれらをシリアル化したい(アタッチ属性を持つデフォルトbeahviourではなく)

、私は次のコードを使用していますそれはリストを平坦化し、XML出力が<animals>タグと <animals> <Dog>Bob</Dog> <Cat>Fred</Cat> <Dog>Mike</Dog> </animals> は保存よりのようなものだった場合、私はそれを好む除いて、素晴らしい作品

[XmlElementAttribute(Order = 4)] 
    [XmlElement("Frog", typeof(Frog))] 
    [XmlElement("Cat", typeof(Cat))] 
    [XmlElement("Dog", typeof(Dog))] 
    public List<Animal> lines = new List<Animal>(); 

+0

動物の種類ごとに別々のクラスを用意する必要があります。 –

+0

どうやってそれをシリアライズしていますか? – JotaBe

答えて

2

変更[XmlElementAttribute(Order = 4)]をルート名、すなわち:[XmlArrayAttribute(Order=4, ElementName="animals")]

* 注:この例では、順序= 4が特定されています。あなたは通常それを必要としません。 *

EDIT:(OPコメントにthaks):

ます。また、そうのように、[XmlElement]から[XmlArrayItem](MSDN doc here)にリストにbelonginオブジェクトのクラスの属性を変更する必要があります

[XmlArrayItem("Frog", typeof(Frog))] 
[XmlArrayItem("Cat", typeof(Cat))] 
[XmlArrayItem("Dog", typeof(Dog))] 
+0

これはまさに私が探していたソリューションで、しばらく見つからなかったでしょう。ありがとう! XmlArrayAttributeを使用する場合は、XmlElementsをXmlArrayItemsに変更する必要があることも追加する価値があります。 – user1217210

+0

ご意見ありがとうございます。私はその細部を完全に忘れてしまった! – JotaBe

0

あなたは、常に独自のクラスでは、リストをラップすることができ、そして、あなたが期待するXML取得します:

ます。また、属性に ElementNameパラメータを指定することができます [XmlArrayAttribute(Order=4)]

ため

public class StackOverflow_10524470 
{ 
    public class Animal 
    { 
     [XmlText] 
     public string Name { get; set; } 
    } 
    public class Dog : Animal { } 
    public class Cat : Animal { } 
    public class Frog : Animal { } 
    public class Root 
    { 
     [XmlElementAttribute(Order = 4, ElementName = "animals")] 
     public Animals animals; 
    } 
    public class Animals 
    { 
     [XmlElementAttribute(Order = 4)] 
     [XmlElement("Frog", typeof(Frog))] 
     [XmlElement("Cat", typeof(Cat))] 
     [XmlElement("Dog", typeof(Dog))] 
     public List<Animal> lines = new List<Animal>(); 
    } 
    public static void Test() 
    { 
     MemoryStream ms = new MemoryStream(); 
     XmlSerializer xs = new XmlSerializer(typeof(Root)); 
     Root root = new Root 
     { 
      animals = new Animals 
      { 
       lines = new List<Animal> 
       { 
        new Dog { Name = "Fido" }, 
        new Cat { Name = "Fluffy" }, 
        new Frog { Name = "Singer" }, 
       } 
      } 
     }; 
     xs.Serialize(ms, root); 
     Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
    } 
} 
関連する問題