如何序列化Nullable <bool>?</bool>

时间:2010-03-09 15:40:13

标签: c# .net serialization nullable boolean

我想简单地通过将其转换为字符串

来序列化可空的bool
public static string SerializeNullableBoolean(bool? b)
{
    if (b == null)
    {
        return "null or -1 or .."; // What to return here?
    }
    else
    {
        return b.ToString();
    }
}

将null值序列化为最合适的字符串是什么?

7 个答案:

答案 0 :(得分:8)

由于bool.ToString()返回“True”或“False”,我会选择“Null”。我也会把它重写为:

return b.HasValue ? b.ToString() : "Null";

编辑:我接受了。 bool?.ToString()返回空字符串,所以我会根据什么更方便来决定。如果一个人需要阅读输出,那么“Null”是更好的选择;如果它只需要在代码中使用,那么空字符串就可以了。如果你使用空字符串,它就像:

一样简单
return b.ToString();

答案 1 :(得分:8)

为什么不:

b.ToString()

如果b为null,则返回空字符串。既然这就是框架返回的内容,我会用它来保持一致。这也是XmlSerializer用于可空标量的内容。

答案 2 :(得分:2)

我会选择一个空字符串来表示空值。

答案 3 :(得分:2)

如果您为真实的bool值返回True / False,则在bnull的情况下,您应该返回Null以保证对称性。

答案 4 :(得分:2)

保持一致。

b.ToString()

返回字符串'true'或'false'。因此,如果您返回-1,如果您实际读取序列化文件,它将不太一致。反序列化代码也将变得更“丑陋”,更不易读。

我会选择将其序列化为字符串'unset'(或沿着这些行的某些内容)或字符串'null'。除非你有非常严格的空间要求或真正庞大的数据集来序列化额外的字符应该不重要。

答案 5 :(得分:1)

如果您正在使用内置的XmlSerializer,您还可以执行以下操作来序列化该值(并防止大量丑陋的自定义序列化代码):

    [Serializable]
    public class Foo
    {
        [XmlIgnore]
        public bool? Bar { get; set; }

        [XmlAttribute("Bar")]
        [EditorBrowsable(EditorBrowsableState.Never)]
        public string xmlBar
        {
            get { return Bar.ToString(); }
            set
            {
                if (string.IsNullOrEmpty(value)) Bar = null;
                else Bar = bool.Parse(value);
            }
        }
    }

答案 6 :(得分:0)

我个人不会使用上述任何一种,只需使用ShouldSerialize接口即可。 例如,

[XmlElement("SomeBoolean ", Namespace = "SomeNamespace")]
public bool? SomeBoolean { get; set; }
public bool ShouldSerializeSomeBoolean() { return SomeBoolean.HasValue; }