2012-06-15 2 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 IXmlSerializable на Table, а также использовать XmlReader и XmlWriter в десериализовать и сериализовать (соответственно) вручную.

2

Существует простое решение для этого:

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

Инициализация как описано @ HackedByChinese отвечают.

Объявите список как [XmlElement], тогда он не будет сериализовать таблицы < >, и xml будет выглядеть точно так, как вы хотите.

+0

+1 Дерп. Я забыл о влиянии 'XmlElement' на коллекции. – HackedByChinese

Смежные вопросы