2010-12-09 2 views
1

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

Например:

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

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

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

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

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

Может ли регулярный XML-сериализатор обрабатывать рекурсивные ссылки, поскольку у меня есть их в моей сущности?

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

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

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

+0

Он должен работать таким образом, в моем приложении я делаю то же самое. – codymanix 2010-12-09 17:46:46

ответ

1

XmlSerializer запускает конструктор/полевые инициализаторы; написанный код должен быть точным. Возможно, вы используете usig DataContractSerializer (т. Е. WCF)? (DCS не работает).

Удобный хак для ФОС:

get { 
    return list ?? (list = new List<string>()); 
} 
+0

Да, на самом деле я использую DCS. Я не знал этой разницы. В этом случае у меня есть рекурсивные ссылки в моей сущности, поэтому я использовал DCS. Может ли XML Serializer обрабатывать рекурсивные ссылки? – 2010-12-09 17:52:29

+0

@miki нет, он не может – 2010-12-09 18:12:29

0

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

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