Инициализация коллекции при создании объекта из XMLSerializer - PullRequest
1 голос
/ 09 декабря 2010

Я использую WCF DataContractSerializer для сериализации и десериализации большого графа объектов в моем приложении. Моя проблема в том, что если у меня есть коллекция, которая инициализируется в объявлении поля, DataContractSerializer не запускает эту инициализацию, и коллекция заканчивается нулем.

Например:

class Test
{
    List<string> collection = new List<string>();

    public List<string> Collection 
    {
         get { return collection; } 
    }
}

После сериализации и десериализации этого класса коллекция будет иметь значение null вместо нового по умолчанию. Если я перенесу инициализацию в свойство get, все будет нормально.

Поскольку у меня довольно большой граф объектов, прохождение всех мест, где это происходит, занимает довольно много времени. Я бы предпочел, если бы был способ сделать это как-то автоматически.

Обновление: я использую WCF DataContractSerializer, поэтому я думаю, именно поэтому он не инициализирует коллекцию.

Может ли обычный XML Serializer обрабатывать рекурсивные ссылки, как у меня в моей сущности?

Обновление: Хорошо, теперь я застрял ... точнее говоря, сущности используются для NHibernate, поэтому у них есть DataContract / DataMember. Но затем я использую IList для свойств BelongsTo / HasMany, и XMLSerializer также не сериализует их, и без рекурсивных ссылок это тоже не пойдет.

Итак, если у нас есть класс, который использует IList и имеет рекурсивные ссылки, есть ли способ, которым я могу его сериализовать / десериализовать и при этом запускать конструкторы объектов по умолчанию?

Обновление: провел еще несколько тестов, похоже, что мне придётся придумать собственный гибрид, так как NH требует IList, который ограничивает меня DCS, и его тегом для проблем ...

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

XmlSerializer запускает конструктор / field-initialisers; код как написано должно быть хорошо. Возможно, вы вместо этого используете DataContractSerializer (т.е. WCF)? (DCS не запускает конструкторы).

Удобный хак для WCF:

get {
    return list ?? ( list = new List<string>() );
}
0 голосов
/ 09 декабря 2010

Самый простой способ решить эту проблему - инициализировать коллекцию в конструкторе по умолчанию.

...