Protobuf忽略默认的布尔值和整数值

时间:2018-07-11 11:53:45

标签: protocol-buffers proto3

我正在将json文件转换为字符串,然后将该字符串转换为proto3文件。

这是json文件:

{    "a": false,
     "b": 0
}

这是我将json文件转换为字符串的方式:

String json =Files.lines(Paths.get(filePath)).collect(Collectors.joining());

这是我将字符串转换为proto3文件的方式:

    JsonFormat.parser().ignoringUnknownFields().merge(json,messageBuilder);
   MyProto proto = messageBuilder.build();

我的json中有boolean和int字段,其中某些字段的值必须为默认值(对于boolean为false,对于int为0)。

当我将上面的文件反序列化为proto3 java文件时,以上两个字段都将被忽略,即使我已明确设置值(如您在上面的json文件中看到的那样),我的json也将变为空。

我知道proto3在反序列化/序列化时会忽略默认值,但是有没有办法忽略即使显式设置为默认值的字段呢?

2 个答案:

答案 0 :(得分:1)

否,Protobuf language guide明确指出这是不可能的:

  

请注意,对于标量消息字段,一旦解析了一条消息,   无法判断字段是否已明确设置为默认值   值(例如,将布尔值设置为false)还是未设置   完全没有:在定义消息类型时应该牢记这一点。   例如,没有布尔值会在   如果您不希望这种行为也发生,则设置为false   默认。另请注意,如果将标量消息字段设置为其   默认情况下,该值不会在网络上序列化。

如果您真的必须知道默认值是否已明确设置,则可以将该信息编码在单独的字段中。

答案 1 :(得分:1)

使用proto2代替proto3。 Proto2具有这种行为-如果显式设置了一个字段,即使它是该字段的默认值,也会对其进行序列化和反序列化。