XML десериализация сложного объекта - PullRequest
2 голосов
/ 12 апреля 2010

У меня есть XML-структура, подобная этой:

<Group id="2" name="Third" parentid="0" />
<Group id="6" name="Five" parentid="4" />   
<Group id="3" name="Four" parentid="2" />
<Group id="4" name="Six" parentid="1" />

parent обозначает идентификатор группы.

Конструктор группы выглядит так:

public Group(string name, int ID, Group parent)

Во время десериализации, как получить родительский элемент с помощью идентификатора и передать в группу?

1 Ответ

1 голос
/ 12 апреля 2010

Если вы используете встроенную обработку, то XmlSerializer действительно хочет использовать конструктор по умолчанию. Вы можете сделать это через:

public class Group {
    public Group() {}

    [XmlAttribute("id")]
    public int Id {get;set;}
    [XmlAttribute("name")]
    public string Name {get;set;}
    [XmlAttribute("parentid")]
    public int ParentId {get;set;}
}

но обратите внимание, что существует большая разница между Group родительским и родительским идентификатором. Я подозреваю, что лучшим подходом было бы или записать данные в более иерархической форме, или , чтобы придерживаться того, что у вас есть, но использовать простой DTO во время десериализации. Затем переведите эти данные в то, что вы на самом деле хотите на следующем этапе. Итак, если у вас есть:

List<GroupDTo> groups = ...

Вы можете перевести это как:

var actualGroups = from group in groups
                   select new Group(group.Id, group.Name,
                      groups.FirstOrDefault(x => x.Id == group.ParentId));

это должно делать то, что вам нужно.

...