代码之家  ›  专栏  ›  技术社区  ›  Manas Saxena

protobuf由于默认值而忽略bool和ints值

  •  0
  • Manas Saxena  · 技术社区  · 6 年前

    我将一个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 回复  |  直到 6 年前
        1
  •  1
  •   gmolau    6 年前

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

    注意,对于标量消息字段,解析消息后 无法判断字段是否显式设置为默认值 值(例如布尔值是否设置为false)或不设置 在定义消息类型时,您应该记住这一点。 例如,当 如果你不希望这种行为也发生在 违约。还要注意,如果标量消息字段设置为 默认情况下,该值不会在连线上序列化。

    如果您真的必须知道是否显式设置了默认值,那么您已经在单独的字段中对该信息进行了编码。

        2
  •  1
  •   Manas Saxena    6 年前

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

    推荐文章