1

xml シリアライゼーションを使用して再現したい次の XML があります。

<Room>
<!-- One light-->  
<light Type="Incadenscent" fin="QS f" ItemType="something "/>
<!-- Unlimited Tables -->
<table Type="BR" Id="10"/>
<table Type="BL" Id="21"/>
<table Type="BR" Id="22"/>
<table Type="GR" Id="35"/>
<table Type="BR" Id="18"/>
<table Type="RE" Id="55"/>
</Room>

以下は私のオブジェクトタイプです:

public class Table
{
    [XmlAttribute("type")]
    public string Type
    {
        get; set;
    }

    [XmlAttribute("Id")]
    public String Id
    {
        get; set;
    }

}

public class Light
{

    [XmlAttribute("type")]
    public string Type
    {
        get; set;
    }

    [XmlAttribute("fin")]
    public string FIN
    {
        get; set;
    }

    [XmlAttribute("ItemType")]
    public string ItemType
    {
        get; set;
    }
 }

public class Room{

      public Table Table
    {
        get; set;
    }

    public Light Light
    {
        get; set;
    }

  }

 public  class Program
{
    static void Main(string[] args)
    {

        List<Room> list = new List<Room>
        {
            new Room
            {

                Light = new Light{ Type="Incadenscent",  fin="QS", ItemType="something"},
                Table = new Table{Type="Metal", Id="10"}
                //error here when I try to add a new table object
                Table = new Table{Type="Wood", Id="13"}
            }
           } ;     
         SerializeToXML(list);

    }
    static public void SerializeToXML(List<Room> sample) 
    {
        XmlSerializer serializer = new XmlSerializer(typeof(List<Room>)););
        TextWriter textWriter = new StreamWriter(@"C:\assets.xml");
        serializer.Serialize(textWriter, sample);
        textWriter.Close();

    }
}

Room オブジェクト内で別のテーブル オブジェクトをインスタンス化しようとすると、エラー (具体的にはオブジェクトの複製) が発生します。私は何を間違っていますか?

例えば:

                **Table = new Table{Type="Wood", Id="13"}**

重複エラーを発生させずに、ルーム リスト内の別のテーブル オブジェクトをインスタンス化するにはどうすればよいですか

4

2 に答える 2

4

そのための簡単な解決策があります:

public class Room
{
     [XmlElement("light")]
     public Light Light { get; set; }
     [XmlElement("table")]
     public List<Table> Tables { get; set; }
}

初期化は、@HackedByChinese の回答で説明されているとおりです。

List を [XmlElement] として宣言すると、<tables> 要素はシリアル化されず、xml は希望どおりに表示されます。

于 2012-06-15T14:08:01.720 に答える
0

XML がクラスと一致しません。は、XML に複数の が含まれている場合に、 oneと oneRoomが含まれていることを宣言します。LightTableTables

Room次のようになります。

public class Room
{
     public Light Light { get; set; }
     public List<Table> Tables { get; set; }
}

次のようにオブジェクトを作成します。

    new Room
    {

        Light = new Light{ Type="Incadenscent",  fin="QS", ItemType="something"},
        Tables = new List<Table>{ new Table{Type="Metal", Id="10"},
                                  new Table{Type="Wood", Id="13"} }
    }

ただし、デシリアライゼーションの問題は引き続き発生します。XmlSerializer は、XML が次のようになることを期待します。

<Room>
    <light Type="Incadenscent" fin="QS f" ItemType="something "/>
    <tables>
       <table Type="BR" Id="10"/>
       <table Type="BL" Id="21"/>
       <table Type="BR" Id="22"/>
       <table Type="GR" Id="35"/>
       <table Type="BR" Id="18"/>
       <table Type="RE" Id="55"/>
     </tables>
</Room>

ただし、結果の XMLが例で指定した方法で表示される必要がある場合は、 on を実装IXmlSerializableTableおよび を使用してXmlReader(XmlWriterそれぞれ) 手動で逆シリアル化およびシリアル化する必要があります。

于 2012-06-15T13:16:01.523 に答える