Protobuf延迟解码子消息

时间:2017-09-10 00:01:31

标签: java deserialization protocol-buffers proto proto3

我在我的项目中使用proto 3(java)。我有一些巨大的protobufs嵌入了较小的消息。有没有办法可以实现我想要查看的只有少数嵌套子消息的部分解码。我目前遇到的问题是我需要加入这个基于原始记录的大量记录数据和其他记录,但我的加入是基于非常小的子消息,所以我不想解码整个巨大的protobuf并且能够只解码嵌套消息(字符串id)才能加入,然后只解码连接数据的整个protobuf。

我尝试使用[lazy=true]标记方法,但我没有看到生成代码的任何差异,我也尝试使用和不使用惰性密钥工作对反序列化时间进行基准测试,并且它没有做到似乎完全没有影响。默认情况下,此功能是否适用于所有字段?或者这甚至可能吗?我确实看到在protobuf-github中有几个类LazyFields.java和测试用例,所以我假设已经实现了这个功能。

1 个答案:

答案 0 :(得分:0)

对于后来碰巧看到此对话且难以理解的人,这是Marc所说的:

如果您的对象是类似的东西

message MyBigMessage{
  string id = 1;
  int sourceType = 2 ;
  And many other fields here, that would be expensive to parse .......

}

您将获得一个必须解析的字节块。但是您只想解析来自特定来源的消息,并且可能匹配特定的id范围。 您可以先使用以下另一条消息来解析这些字节:

message MyFilterMessage{
  string id = 1; //has to be 1 to match
  int sourceType = 2 ; //has to be 1 to match
  And NOTHING ELSE here.......
}

然后,您可以查看sourceType和id。如果它们与您要过滤的内容匹配,则可以再次解析字节,但是这次使用MyBigMessage解析整个内容。

要知道的另一件事: 仅供参考:根据这篇文章,自2017年起,Java(消息集除外)已禁用了惰性解析: https://github.com/protocolbuffers/protobuf/issues/3601#issuecomment-341516826 我不知道目前的状态。懒得试图找出答案! :-)