Десериализация XML удваивается на объектах - PullRequest
0 голосов
/ 14 апреля 2010

У меня есть файл XML, который я пытаюсь десериализовать в соответствующие объекты. Он прекрасно работает на большинстве этих объектов, за исключением одного предмета, который удваивается. Вот соответствующая часть XML:

 <Clients>
    <Client Name="My Company" SiteID="1"
 GUID="xxx-xxx-xxx-xxx">
        <Reports>
          <Report Name="First Report" Path="/Custom/FirstReport">
            <Generate>true</Generate>
          </Report>
        </Reports>
    </Client>
 </Clients>

«Клиенты» - это объект List<Client>. Каждый объект Client содержит объект List<Report>. Проблема заключается в том, что при десериализации этого XML-объекта объект List<Report> имеет счет 2 - объект «Первый отчет» Report находится там дважды. Зачем? Вот C #:

public class Client {
    [System.Xml.Serialization.XmlArray("Reports"), System.Xml.Serialization.XmlArrayItem(typeof(Report))]
    public List<Report> Reports;
}

public class Report {
    [System.Xml.Serialization.XmlAttribute("Name")]
    public string Name;

    public bool Generate;

    [System.Xml.Serialization.XmlAttribute("Path")]
    public string Path;
}

class Program
{
    static void Main(string[] args)
    {
        List<Client> _clients = new List<Client>();
        string xmlFile = "myxmlfile.xml";
        System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(List<Client>), new System.Xml.Serialization.XmlRootAttribute("Clients"));
        using (FileStream stream = new FileStream(xmlFile, FileMode.Open))
        {
            _clients = xmlSerializer.Deserialize(stream) as List<Client>;
        }
        foreach(Client _client in _clients)
        {
            Console.WriteLine("Count: " + _client.Reports.Count); // This write "2"
            foreach(Report _report in _client.Reports)
            {
                Console.WriteLine("Name: " + _report.Name); // Writes "First Report" twice
            }
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 14 апреля 2010

О, теперь я чувствую себя немного глупым. Мой конструктор для класса Client, когда он инициализирует объект List<Report>, добавляет к нему отчет по умолчанию. А затем XML добавляет тот, который он нашел. Таким образом, удваивая это. :: вздыхать ::

0 голосов
/ 14 апреля 2010

Используя этот точный код и XML, я получаю 1 элемент в _client.Reports (для 3.5 и 4.0). Я хотел бы убедиться, что вы получаете правильный XML и используете правильный класс Report. Может быть, это относится к одному в другом пространстве имен.

...