gpt4 book ai didi

c# - 序列化可空类型的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 18:49:33 25 4
gpt4 key购买 nike

我正在我的一个类中实现 IXMLSerializable。它包含一些可以为 null 的数字属性(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 提供一点背景知识。我正在开发一个建筑设计程序,我需要一个代表 Floors 集合的类。每个 Floor 都有诸如 Floor.Area 面积、Floor.Height 等属性。然而,楼层的高程由总和定义它下面的楼层高度。因此,每当 Floor.Height 属性更改或修改 FloorCollection 时,Floors 的高度都会重新计算。

我需要序列化的 FloorCollection 类继承自 BindingList。如果我尝试直接序列化此类,它将序列化楼层集合,但不会序列化类中的任何属性或字段。看我的previous post on this .

现在,我正在尝试添加限制集合中建筑物楼层的最大高度、最大顶部标高和最小底部标高的功能。所以我使用可为空的 double 来表示这些限制,其中空值表示不受限制。高程属性可以是正数、负数或零。因此需要有一个备用状态,null,用于标识何时没有限制。

现在,我认为总体上可能更容易的做法是只使用一个单独的 bool 值来标识是否存在海拔/高度限制,然后再使用一个常规的 double 属性来标识限制(如果启用)是什么。

最佳答案

您希望始终为属性编写 XML,但如果属性值为空,您希望包含一个 xsi:nil="true"属性。

void IXmlSerializable.WriteXml(XmlWriter writer)
{
...

if (this._PropName == null)
{
writer.WriteStartElement("PropName");
writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true");
writer.WriteEndElement();
}
else
{
writer.WriteElementString("PropName", this._PropName.ToString());
}
...
}

您可能还想编写一个 xsi:type="xsd:datatype"属性,其中 xsd 是 http://www.w3.org/2001/XMLSchema命名空间。这将允许您在反序列化期间读回数据类型,以了解是否(以及如何)转换该值。

关于c# - 序列化可空类型的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1291467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com