【问题标题】:How to serialize Nullable<bool>?如何序列化 Nullable<bool>?
【发布时间】:2011-01-25 11:58:23
【问题描述】:

我想序列化一个可以为空的布尔值,只需将其转换为字符串

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

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

【问题讨论】:

  • 感谢大家的意见!
  • 肯定是:truefalseFileNotFound! (向 DailyWTF 网站点头)。

标签: c# .net serialization nullable boolean


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您为真实的 bool 值返回 True/False,则为了对称,您应该返回 Null,以防 bnull

    【讨论】:

      【解决方案3】:

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

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

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

      return b.ToString();
      

      【讨论】:

        【解决方案4】:

        保持一致。

        b.ToString()
        

        返回字符串“真”或“假”。因此,如果您返回 -1,如果您实际读取序列化文件,则一致性会降低。反序列化代码也会变得更“丑”,可读性更差。

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

        【讨论】:

          【解决方案5】:

          为什么不:

          b.ToString()
          

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

          【讨论】:

            【解决方案6】:

            如果您使用的是内置的 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);
                        }
                    }
                }
            

            【讨论】:

            • 我实际上并没有检查 XmlSerializer 是否会正确处理可为空的 bool,所以这可能是不需要的。
            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 2012-07-27
              • 2014-11-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多