当未设置可选字段时,大象鸟库生成字段的默认值而不是 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# 部分,以减少您对它的困惑。你的问题是关于 Thriftstruct
s 中 optional
字段的行为。以上是关于当未设置可选字段时,大象鸟库生成字段的默认值而不是 null的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?
使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?
使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?