2011-01-08 1 views
1

Testのタイプのクラス要素をシリアル化しようとすると、XmlRootを使用して設定されたルート要素を「テスト」として提供します。XmlRootで装飾されたシリアライズクラス、リストで使用するとエラーが発生する

Elemsクラスの要素をシリアル化しようとすると、テスト要素は "テスト"ではなくルート要素 "テスト"でシリアル化されます。

[XmlRoot("testing")] 
public class Test 
{ 
} 

public class Elems 
{ 
    public List<Test> how = new List<Test>(); 

    public Elems() 
    { 
     how.Add(new Test()); 
     how.Add(new Test()); 
     how.Add(new Test()); 
    } 
} 

このElemsはシリアル化され、出力

<Elems xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" x 
mlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <how> 
    <Test /> 
    <Test /> 
    <Test /> 
    </how> 
</Elems> 

ではなく、これは私が必要とするものです。

<Elems xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" x 
mlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <how> 
    <testing /> 
    <testing /> 
    <testing /> 
    </how> 
</Elems> 

おかげ

+0

XMLRootはにのみ適用され - 最も外側のオブジェクト。 –

+0

には、TestクラスがList内のルートとして「テスト」にシリアル化されている方法はありますか? – Rozuur

+0

あなたは[XmlElement]または[XmlArrayItem]を使用することができます –

答えて

3

は次のように試してみてください:そのオブジェクトがルートのとき

public class Test { } 

public class Elems 
{ 
    public Elems() 
    { 
     How = new List<Test>(); 
     How.Add(new Test()); 
     How.Add(new Test()); 
     How.Add(new Test()); 
    } 

    [XmlArray("how")] 
    [XmlArrayItem("testing")] 
    public List<Test> How { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var elems = new Elems(); 
     var serializer = new XmlSerializer(elems.GetType()); 
     serializer.Serialize(Console.Out, elems); 
    } 
} 
+0

これは動作しますが、XmlRootデコレーションがListで使用されていると動作しないのはなぜですか? – Rozuur

+0

@Rozuur、XmlRootは、あなたのケースではElemsであるシリアル化しているオブジェクトにのみ適用されます。子プロパティの他のXmlRoot属性は無視されます。それが実装されている方法です。 –

関連する問題