【发布时间】:2009-08-18 02:20:03
【问题描述】:
我正在我的一个类中实现 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 都具有诸如 Floor.Area 面积、Floor.Height 等属性。然而,楼层的标高由总和定义它下面的楼层高度。因此,每当 Floor.Height 属性更改或 FloorCollection 被修改时,都会重新计算 Floors 的标高。
我需要序列化的 FloorCollection 类继承自 BindingList。如果我尝试直接序列化此类,它将序列化楼层的集合,但不会序列化类中的任何属性或字段。见我的previous post on this。
现在我正在尝试添加限制集合中建筑物楼层的最大高度、最大顶部标高和最小底部标高的功能。所以我使用可为空的双精度来表示这些限制,其中空值表示不受限制。高程属性可以是正数、负数或零。因此,需要有一个备用状态 null 来标识何时没有限制。
现在我认为,如果有一个单独的布尔值来标识是否存在海拔/高度限制,然后有一个常规的 double 属性来标识启用它的限制是什么,总体上可能会更容易。
【问题讨论】:
-
这并不可怕,但考虑属性是字符串而不是双精度的情况。字符串的正确标志值是什么?
-
实施
IXmlSerializable通常是 IMO 的坏事。你失去了所有的简单性和良好的模式,这使得它首先是令人向往的。 -
@Eric,我认为K Marc 有一个观点,Scott 提出了一些问题。您能否解释一下您一般使用 XML 序列化并具体实现 IXmlSerializable 的目的是什么?它可以帮助我们了解最适合您需求的答案。
-
谢谢。实际上,我认为它可以为空就可以了。这比在另一个属性设置为 false 时忽略一个值更清楚。当然,我更喜欢 Decimal 以加倍。
标签: c# serialization nullable ixmlserializable