Есть ли способ, чтобы XmlSerializer не инициализировал нулевое свойство при десериализации? - PullRequest
10 голосов
/ 03 февраля 2010

У меня есть этот класс:

public class MySerializableClass
{
    public List<MyObject> MyList { get; set; }
}

Если MyList равен нулю, когда MySerializableClass сериализуется, мне нужно, чтобы он также был нулевым, когда он тоже десериализован, но XmlSerializer всегда инициализирует его, когда десериализует мой класс.

Есть ли способ избежать инициализации нулевых свойств?

MyList даже не записывается в сериализованный файл, когда он нулевой. Когда я загружаю его с нулевыми значениями и сохраняю его снова, MyList больше не является нулевым, он сериализуется как List <> с 0 элементами, но не с нулевым.

Спасибо.

Дополнительная информация:

Свойство IsDeserializing нежизнеспособно из-за некоторых ограничений кода в структуре класса

Ответы [ 4 ]

11 голосов
/ 03 февраля 2010

Это похоже на ошибку ...

Даже если вы попытаетесь пометить свойство как обнуляемое, оно, похоже, не сработает.

[XmlArray(IsNullable = true)]
public List<MyObject> MyList { get; set; }

Он сериализует свойство MyList следующим образом:

<MyList xsi:nil="true" />

Таким образом, XML ясно указывает, что список нулевой, но после десериализации он все еще инициализируется в пустой список ...

Если вы замените List<MyObject> на MyObject[], он отлично работает (даже без IsNullable = true), но, вероятно, это не то, что вам нужно ...

Вероятно, вы должны сообщить об этом на Connect .

0 голосов
/ 11 августа 2014

Если вы добавляете свойство с именем * PropertyName *, указанным как логическое значение, XmlSerializer будет отображать тег для списка только тогда, когда оно истинно.

Пример:

public class MySerializableClass
{
    public List<MyObject> MyList { get; set; }

    [XmlIgnore]
    public bool MyListSpecified { get; set; }
}
0 голосов
/ 09 июля 2013

У меня была та же проблема, но добавление XmlArrayAttribute к свойству без заданного значения заставило его работать для меня

public class MySerializableClass
{
    [XmlArray]
    public List<MyObject> MyList { get; set; }
}
0 голосов
/ 03 февраля 2010

Не используйте автоматически реализованные свойства, если вам нужен ноль там. используйте, например,

public class MySerializableClass 
{ 
    List<MyObject> myList 
    public List<MyObject> MyList { get {return myList;} set {myList = value;} } 
} 
...