0

我在我的项目中使用 proto 3 (java)。我有一些嵌入了较小消息的巨大 protobuf。有没有一种方法可以对我想查看的少数嵌套子消息进行部分解码。我目前遇到的问题是我需要将这个基于原型的巨大记录数据与另一条记录连接起来,但我的连接是基于非常小的子消息,所以我不想解码整个巨大的 protobuf 并且只能解码要加入的嵌套消息(字符串 id),然后只为加入的数据解码整个 protobuf。

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

4

1 回答 1

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(MessageSet 除外)中被禁用: https ://github.com/protocolbuffers/protobuf/issues/3601#issuecomment-341516826 我不知道当前状态。懒得去试了!:-)

于 2020-12-11T17:34:42.673 回答