2012-06-15 119 views
1

我有下面的XML,我想使用XML序列化重現:C#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"}** 

我如何可以實例在房間列表中的其他表對象沒有得到一個重複錯誤

+0

每個房間都有一盞燈和一張桌子,因此,要添加另一張桌子,您需要另一個房間。 –

+0

如何在房間列表中實例化另一個表格對象而不會出現重複錯誤? – user1324418

回答

0

您的XML不匹配的類。 Room聲明它包含一個Light和一個Table,其中XML有多個Tables

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 必須看你在你的例子中指定的方式,您將需要implement IXmlSerializableTable,並使用XmlReaderXmlWriter到反序列化和序列化(分別)手動。

2

沒有爲一個簡單的解決方案:是由@ HackedByChinese的回答說明

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

初始化。

將列表聲明爲[XmlElement],那麼它將不會序列化<表>表中的元素,並且xml將看起來完全符合您的需要。

+0

+1 Derp。我忘記了'XmlElement'對集合的影響。 – HackedByChinese