我正在我的一个类中实现 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;
}
...
}
更新: 有人问我为什么要实现IXmlSerializable的背景知识。我正在开发一个建筑设计程序,我需要一个代表楼层集合的类。每个楼层都具有诸如Floor.Area面积、Floor.Height等属性。但是,楼层的标高由其下方楼层高度的总和定义。因此,每当Floor.Height属性更改或FloorCollection被修改时,都会重新计算Floors的高度。
我需要序列化的FloorCollection类继承自 BindingList。如果我尝试直接序列化此类,它将序列化楼层的集合,但不会序列化类中的任何属性或字段。请参阅我之前的帖子。
现在我正在尝试添加限制集合中建筑物楼层的最大高度、最大顶部标高和最小底部标高的功能。所以我使用可为空的双精度来表示这些限制,其中空值表示不受限制。高程属性可以是正数、负数或零。因此,需要有一个备用状态 null 来标识何时没有限制。
现在我想,如果有一个单独的布尔值来标识是否存在海拔/高度限制,然后有一个常规的双属性来标识启用它的限制是什么,总体上可能会更容易。