Предположим, у меня есть этот объект:
[Serializable]
public class MyClass
{
public int Age { get; set; }
public int MyClassB { get; set; }
}
[Serializable]
public class MyClassB
{
public int RandomNumber { get; set; }
}
XmlSerializer будет сериализовать объект следующим образом:
<MyClass>
<Age>0</age>
<MyClassB>
<RandomNumber>4234</RandomNumber>
</MyClassB>
</MyClass>
Как я могу сделать свойство Age nullable? IE: чтобы не сериализовать свойство Age, когда оно меньше 0?
Я пытался с Nullable, но он сериализовал мой объект так:
<MyClass>
<Age d5p1:nil="true" />
<MyClassB>
<RandomNumber>4234</RandomNumber>
</MyClassB>
</MyClass>
Читая документацию MSDN, я нашел это:
Нельзя применить свойство IsNullable к члену, типизированному как тип значения, поскольку тип значения не может содержать нулевую ссылку nullNothingnullptra (Nothing в Visual Basic). Кроме того, вы не можете установить для этого свойства значение false для типов значений Nullable. Когда такие типы имеют нулевую ссылку nullNothingnullptra (Nothing в Visual Basic), они будут сериализованы путем установки xsi: nil в значение true.
источник: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.isnullable.aspx
Я понимаю, что тип значения не может быть установлен равным нулю. Значение типа всегда установлено на что-то. Сериализация не может принять решение о сериализации или нет, основываясь на ее текущем значении.
Я попробовал с атрибутами, но это не сработало. Я пытался создать объект agecontainer и управлять его сериализацией с помощью атрибутов, но это не сработало.
Что я действительно хочу, это:
<MyClass>
<MyClassB>
<RandomNumber>4234</RandomNumber>
</MyClassB>
</MyClass>
Когда свойство Age ниже 0 (ноль).
Похоже, вам придется реализовать пользовательскую сериализацию.
Да, я тоже об этом, но я бы хотел обойтись без этого.
В приложении объект намного сложнее, и я бы не хотел сам обрабатывать сериализацию.