【问题标题】:Serialize Boolean to "1" and "0" instead of "true" and "false"将布尔值序列化为“1”和“0”而不是“true”和“false”
【发布时间】:2011-06-14 08:10:53
【问题描述】:

我在Boolean 类上找不到任何方法将布尔值序列化为“1”和“0”而不是“true”和“false”。

是否有任何本机功能可以做到这一点?如果不是,什么是最好的方式(最优化的方式)?

更新:我确实是想从Boolean 中生成String

【问题讨论】:

  • 什么方法将Boolean序列化为“true”和“false”?还是您只是在谈论从Boolean 生成String
  • b 成为布尔值:int i = b ? 1 : 0;
  • @Matthieu,您有 10 多个问题尚未接受。 ;)
  • @Kevin:小心!他说的是Boolean,在这种情况下b可能是null
  • @Kevin 你是说int i == b ? 1 : 0; 吗?

标签: java serialization boolean


【解决方案1】:

如果您正在谈论从给定的Boolean 生成String,那么不,没有生成“0”或“1”的内置方法,但是您可以轻松写出来:

public static String toNumeralString(final Boolean input) {
  if (input == null) {
    return "null";
  } else {
    return input.booleanValue() ? "1" : "0";
  }
}

根据您的用例,如果input 为空,则让它抛出NullPointerException 可能更合适。如果您是这种情况,那么您可以将方法简化为单独的第二行 return

【讨论】:

  • 您似乎错过了方法中的数据类型
  • @Eng.Fouad:确实我做到了,感谢您的提醒。现已修复。
【解决方案2】:

你可以使用CompareTo:

public static Integer booleanToInteger(Boolean bool)
{
    if(bool == null) return null;
    else return bool.compareTo(Boolean.FALSE);
}

【讨论】:

  • 我不鼓励这样做,因为它非常模糊且不明显。 如果你这样做,我会使用Boolean.FALSE作为参数,以跳过自动装箱。
  • ... 并且模糊/混淆的代码不太可能被 JIT 编译器优化。
【解决方案3】:

如果你想序列化为一个字符,你可以这样做

public static char toChar(final Boolean b) {
    return b == null ? '?' : b ? '1' : '0';
}

【讨论】:

    【解决方案4】:

    我不确定,只是把它扔掉。您可以使用自己的装饰器类。

    【讨论】:

    • 装饰器设计模式可以让您以不同的方式自定义输出。您可以将boolean 装饰为01 值。
    • 您是否看到 OP 在哪里要求“最优化”的解决方案?你认为装饰师符合条件吗?
    【解决方案5】:

    使用 Thrift API:

    TSerializer serializer = new TSerializer(new TSimpleJSONProtocol.Factory());
    String json = serializer.toString(object);
    

    它将布尔值为 0 或 1 而不是真/假。

    【讨论】:

    • 你是认真的吗?安装整个库,使用 2 个带有工厂的对象,所有这些都只是为了将字符串转换为布尔值……
    猜你喜欢
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多