我正在将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在反序列化/序列化时会忽略默认值,但是有没有办法忽略即使显式设置为默认值的字段呢?
答案 0 :(得分:1)
否,Protobuf language guide明确指出这是不可能的:
请注意,对于标量消息字段,一旦解析了一条消息, 无法判断字段是否已明确设置为默认值 值(例如,将布尔值设置为false)还是未设置 完全没有:在定义消息类型时应该牢记这一点。 例如,没有布尔值会在 如果您不希望这种行为也发生,则设置为false 默认。另请注意,如果将标量消息字段设置为其 默认情况下,该值不会在网络上序列化。
如果您真的必须知道默认值是否已明确设置,则可以将该信息编码在单独的字段中。
答案 1 :(得分:1)
使用proto2代替proto3。 Proto2具有这种行为-如果显式设置了一个字段,即使它是该字段的默认值,也会对其进行序列化和反序列化。