4

我正在将 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 字段,其中一些字段的值必须是默认值(布尔为 false,int 为 0)。

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

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

4

2 回答 2

3

不,Protobuf 语言指南明确指出这是不可能的:

请注意,对于标量消息字段,一旦解析了消息,就无法判断一个字段是显式设置为默认值(例如布尔值是否设置为 false)还是根本没有设置:您应该在定义消息类型时请注意。例如,如果您不希望在默认情况下也发生该行为,则不要在设置为 false 时打开某些行为的布尔值。另请注意,如果标量消息字段设置为其默认值,则该值将不会在线上序列化。

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

于 2018-07-12T14:55:22.557 回答
2

使用 proto2 而不是 proto3 。Proto2 有这种行为——如果一个字段被显式设置,即使它是该字段的默认值,它也会被序列化和反序列化。

于 2018-07-15T17:10:37.457 回答