Я реализую IXMLSerializable в одном из моих классов. Он содержит несколько числовых свойств, которые являются нулевыми (int? Double? И т. Д.).Каков правильный способ сериализации типов с нулевым значением?
Каков правильный способ сериализации/сериализации данных через IXMLSerializable? Вот что я делаю сейчас, что работает, но, очевидно, не похоже на правильный способ сделать это.
void IXmlSerializable.WriteXml(XmlWriter writer)
{
...
if (this._PropName == null)
{
writer.WriteElementString("PropName", "NULL");
}
else
{
writer.WriteElementString("PropName", this._PropName.ToString());
}
...
}
void IXmlSerializable.ReadXml(XmlReader reader)
{
string tempStr;
...
reader.ReadStartElement("PropName");
if (tempStr != "NULL")
{
this._PropName = double.Parse(tempStr);
}
else
{
this._PropName = null;
}
...
}
Update: Был задан вопрос о том, что я даю немного фона, почему я реализую IXmlSerializable. Я работаю над программой для архитектурного проектирования, где мне нужен класс, представляющий коллекцию Floors. Каждый Этаж имеет такие свойства, как Floor.Area, Floor.Height и т. Д. Высота пола, однако, определяется суммой высот пола под ним. Таким образом, всякий раз, когда изменяется свойство Floor.Height или изменяется размер FloorCollection, возвышения . Полы повторно заправлены.
Мой класс FloorCollection, который мне нужно для сериализации, наследуется от BindingList. Если я попытаюсь сериализовать этот класс напрямую, он сериализует сбор полов, но не какие-либо свойства или поля в классе. См. Мой previous post on this.
Теперь я пытаюсь добавить возможность ограничить максимальную высоту, максимальную высоту и минимальную высоту надстройки этажей здания в коллекции. Поэтому я использую nullable doubles для представления этих ограничений, где нулевое значение означает неограниченное. Свойства возвышения могут быть положительными, отрицательными или нулевыми. Таким образом, должно существовать альтернативное состояние, null, которое идентифицирует, когда нет ограничений.
Теперь, когда мне кажется, что проще всего иметь отдельное логическое значение, которое определяет, существует ли ограничение высоты/высоты, а затем регулярное двойное свойство, которое идентифицирует, что такое ограничение, если оно включено.
Кажется мне хорошо? –
Это не страшно, но рассмотрим случай, когда свойство является строкой, а не двойной. Что такое правильное значение флага для строки? –
Реализация 'IXmlSerializable', как правило, является плохой ИМО. Вы теряете всю простоту и доброту схемы, что делает ее желаемой в первом месте. –