使用thrift在java生成的文件中使用额外的布尔值设置字段

时间:2017-10-18 07:28:16

标签: java thrift

我有一个thrift文件point.thrift只有两个变量如下:

struct Point {
  1: double lat,
  2: double lon
}

但是当我使用

生成java文件时
thrift --gen java point.thrift

然后生成的java代码有其他布尔变量,setLat和setLon。所以,我的Point对象如下所示:

"point": {
  "lat": 12.983451879142935,
  "lon": 77.75181960314512,
  "setLat": true,
  "setLon": true
}

是否有任何方法可以从我的点对象中删除这些额外的布尔变量,因为它增加了我的对象的大小,这反过来会占用我存储它们时的大量空间。请注意,这是基本定义,但实际定义将包含许多其他字段。因此,存储是我关心的问题。

2 个答案:

答案 0 :(得分:1)

也许您正在寻找"必需"?

user@ubuntu:~/test$ cat point.thrift
struct Point {
  1: required double lat,
  2: required double lon}
user@ubuntu:~/test$ thrift -gen java point.thrift 
user@ubuntu:~/test$ cat gen-java/Point.java | grep public | grep -v '{'
  public double lat; // required
  public double lon; // required
  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
  public Point(
user@ubuntu:~/test$ 

必需表示该字段必须始终存在,因此请确保语义适合。

答案 1 :(得分:1)

Thrift编译器生成一个bitset来确定设置或未设置的字段。这些的背景在于代码已经说过:必要性。

简而言之:Thrift支持三种要求,optionalrequired和第三种称为&#34;默认&#34; requiredness。后者在没有明确的optionalrequired规范时发生。 Thrift运行时库使用这些标志来确定是否为特定字段分配了值。

在Java的情况下,实现显然总是生成这些&#34; isset&#34;比特,无论你指定什么要求。