代码之家  ›  专栏  ›  技术社区  ›  Gustaf Carleson

如何序列化可为空的<bool>?

  •  5
  • Gustaf Carleson  · 技术社区  · 16 年前

    我只想通过将一个可为空的bool转换成一个字符串来序列化它。

    public static string SerializeNullableBoolean(bool? b)
    {
        if (b == null)
        {
            return "null or -1 or .."; // What to return here?
        }
        else
        {
            return b.ToString();
        }
    }
    

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

    7 回复  |  直到 12 年前
        1
  •  8
  •   Jamie Ide    16 年前

    由于bool.tostring()返回“true”或“false”,我将使用“null”。我还要将其改写为:

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

    编辑:我收回。布尔?.tostring()返回空字符串,因此我将根据更方便的方式来决定。如果一个人需要阅读输出,那么“null”是一个更好的选择;如果它只需要在代码中使用,那么空字符串就可以了。如果使用空字符串,那么它很简单:

    return b.ToString();
    
        2
  •  8
  •   Keltex    16 年前

    为什么不:

    b.ToString()
    

    如果b为空,则返回空字符串。因为这是框架返回的结果,所以我会使用它来保持一致。这也是 XmlSerializer 用于可为空的标量。

        3
  •  2
  •   Blindy    16 年前

    如果你真的返回真/假 bool 值,为了对称起见,应该返回null b 是 null .

        4
  •  2
  •   wasatz    16 年前

    保持一致。

    b.ToString()
    

    返回字符串“true”或“false”。因此,如果返回-1,则实际读取序列化文件时的一致性会降低。反序列化代码也将变得更“难看”,可读性较差。

    我会选择将它序列化为字符串“unset”(或其他类似的行)或字符串“null”。除非您有非常严格的空间要求或非常大的数据集来序列化额外的字符,否则这并不重要。

        5
  •  2
  •   Hans Kesting    16 年前

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

        6
  •  1
  •   Gord    16 年前

    如果使用内置的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);
                }
            }
        }
    
        7
  •  0
  •   Rushi    12 年前

    就我个人而言,我不会使用以上任何一个,而只是使用shouldserialize接口。 例如,

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