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

Java 未设置可选字段时,大象鸟库生成字段的默认值,而不是null,java,apache-pig,thrift,elephantbird,Java,Apache Pig,Thrift,Elephantbird,我目前正在使用大象鸟猪库的4.4版。如果我试图从一个thrift对象生成一个元组,我希望没有在对象中设置的字段在元组中被标记为null。但是,默认值被放入元组中。例如 struct PropValueUnion { 1: optional i32 intValue, 2: optional i64 longValue, 3: optional string stringValue, 4: optional double doubleValue, 5: op

我目前正在使用大象鸟猪库的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
} 
下面的输出应该是(null,null,abc,null,null)

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

问题是字段的isset信息在转换为元组的过程中丢失。这是故意的吗?这个问题有解决办法吗

我希望未在对象中设置的字段在元组中标记为null。但是,默认值被放入元组中。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 ...

}
公共类PropValueUnion实现org.apache.thrift.TBase、java.io.Serializable、Cloneable、Comparable{
//…省略了许多其他代码。。。
//isset id分配
私有静态final int uu INTVALUE_ISSET_ID=0;
私有静态final int u_LONGVALUE _ISSET_ID=1;
私有静态final int uu DOUBLEVALUE _ISSET_ID=2;
私有静态最终int uu标志u ISSET u ID=3;
专用字节uu isset_位字段=0;
//…省略了许多其他代码。。。
/**如果设置了字段doubleValue(已指定值),则返回true,否则返回false*/
公共布尔值isSetDoubleValue(){
返回EncodingUtils.testBit(uuu isset_位字段,uu DOUBLEVALUE_isset_ID);
}
public void setDoubleValueIsSet(布尔值){
__isset\u bitfield=EncodingUtils.setBit(uu isset\u bitfield,uu DOUBLEVALUE\u isset\u ID,value);
}
//…省略了更多的代码。。。
}

elephant bird是一个JAVA库。这个问题涉及到这个库以及该库如何从pig元组转换到thrift对象,反之亦然,而不是一般意义上的thrift语义。我现在删除了C#部分,以减少您的混淆。您的问题是关于Thrift
struct
s中
optional
字段的行为。
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 ...

}