java 使用 thrift 生成的文件中的额外布尔集字段

Extra boolean set fields in java generated file using 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
}

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

也许您正在寻找 "required"?

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$ 

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

Thrift 编译器生成一个位集来确定设置或未设置哪些字段。这些的背景在于codef已经说过的:requiredness.

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

在 Java 的情况下,实现显然总是生成这些 "isset" 位,无论您指定什么要求。