当未设置可选字段时,大象鸟库生成字段的默认值而不是 null

Posted

技术标签:

【中文标题】当未设置可选字段时,大象鸟库生成字段的默认值而不是 null【英文标题】:elephant-bird library generates default values of fields instead of null when an optional field is not set 【发布时间】:2014-01-30 12:35:59 【问题描述】:

我目前正在使用 4.4 版的大象鸟猪库。如果我尝试从一个 thrift 对象创建一个元组,我希望未在对象中设置的字段在元组中被标记为 null。然而,默认值被放入元组中。例如。

struct PropValueUnion 
    1: optional i32 intValue,
    2: optional i64 longValue,
    3: optional string stringValue,
    4: optional double doubleValue,
    5: optional bool flag
 

following 的输出应该是 (null,null,abc,null,null)

PropValueUnion value = new PropValueUnion();
a.setStringValue("abc");
System.out.println(ThriftToPig.newInstance(PropvalueUnion.class).getPigTuple(value));

实际:(0,0,abc,0.0,0)

问题是字段的 isset 信息在转换为元组期间丢失。是故意这样做的吗?是否有解决此问题的方法?

【问题讨论】:

【参考方案1】:

我希望未在对象中设置的字段在元组中标记为空。然而,默认值被放入元组中。 E

没错。可以通过检查isset 标志来检测是否设置了可选字段。

public class PropValueUnion implements org.apache.thrift.TBase<PropValueUnion, PropValueUnion._Fields>, java.io.Serializable, Cloneable, Comparable<PropValueUnion> 

  // ... lots of other code omitted ...

  // isset id assignments
  private static final int __INTVALUE_ISSET_ID = 0;
  private static final int __LONGVALUE_ISSET_ID = 1;
  private static final int __DOUBLEVALUE_ISSET_ID = 2;
  private static final int __FLAG_ISSET_ID = 3;
  private byte __isset_bitfield = 0;

  // ... lots of other code omitted ...

  /** Returns true if field doubleValue is set (has been assigned a value) and false otherwise */
  public boolean isSetDoubleValue() 
    return EncodingUtils.testBit(__isset_bitfield, __DOUBLEVALUE_ISSET_ID);
  

  public void setDoubleValueIsSet(boolean value) 
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __DOUBLEVALUE_ISSET_ID, value);
  

  // ... even more code omitted ...


【讨论】:

elephant-bird 是一个 JAVA 库。这个问题与该库有关,以及该库如何从猪元组转换为节俭对象,反之亦然,而不是关于一般的节俭语义。 我已经给你Java部分了。我现在删除了 C# 部分,以减少您对它的困惑。你的问题是关于 Thrift structs 中 optional 字段的行为。

以上是关于当未设置可选字段时,大象鸟库生成字段的默认值而不是 null的主要内容,如果未能解决你的问题,请参考以下文章

如何设置TextBox空字符串的默认值而不是null

使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?

使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?

使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?

如何按显示的值而不是数据字段值对gridview列进行排序/过滤

sqlite 的比较等运算是根据不同的值而不同的,并不是根据的字段类型,因为 sqlite 是弱类型字段