当前位置: 首页 > 知识库问答 >
问题:

我们可以在谷歌协议缓冲区文本格式的解析器中调用自定义回调函数吗?

骆嘉石
2023-03-14

在google协议缓冲区中,存在一个文本版本的消息。在解析这个文本消息时,我们能否定义回调函数,以便将解析的信息存储到我们自己的数据结构中?例如,如果我们已经定义了。原型:

message A {
    required string name = 1;
    optional string value =2;
    repeated B bList =3;
}

message B {
    required string name =1;
    optional string value =2;
}

我们有文本格式的信息:

A {
    name: "x"
    value: "123"
    B {
        name: "y"
        value: "987"
    }
    B {
        name: "z"
        value: "965"
    }
}

protobuf编译器生成名为“A”的相应类,名为“B”的类。解析器可以将这种文本格式解析为A的实例。但是,如果用户想要定义我们自己版本的类“A”,或者存在以前使用过的A的版本。现在,由于我们想用google protocol buffer替换旧的exchange格式,我们愿意将google protocol buffer文本格式版本直接解析到旧的数据结构中。如果没有,我们必须首先填充生成的数据结构(A类),然后将生成的数据结构调整为遗留数据结构。它占用的内存是必需的两倍。它的效率可能比我们想要的低得多。集成解析器的传统方法是使用一个解析器,该解析器可以回调自定义的函子以适应新的数据结构。那么,是否存在将自定义回调函数注入文本格式解析器的方法?

共有1个答案

吕高雅
2023-03-14

不,协议的文本格式实现不支持这样的扩展。

也就是说,TextFormat(至少在C、Java和Python中)是作为一个自包含模块实现的,它只在公共接口(主要是反射接口)上运行。您可以轻松地克隆它,然后对格式进行自己的修改,甚至可以用实现任意格式的相同样式编写一个全新的模块。例如,许多人以TextFormat实现为指导,基于Protobuf反射编写了JSON解析器/编码器。

 类似资料:
  • 问题内容: 是否可以在Java中的协议缓冲区? C ++版本具有它:在这里 问题答案: 这是ParseFromString的实现(请注意,只需调用一个新对象): 您可以看到只是清除了消息,然后调用。尽管协议缓冲区的Java实现没有方法,但是您可以轻松实现它:

  • 是否有可能解析传入的google协议缓冲区数据报而不使用任何缓冲区。原始文件?我只是现在使用协议缓冲区对其进行了序列化,但不知道IDL文件。 我在寻找一种通过某种反射来迭代任何值的方法?这可能吗? 非常感谢。

  • 根据示例代码https://developers.google.com/protocol-buffers/docs/cpptutorial,它们展示了如何解析二进制格式的原始文件。使用 我尝试删除文本格式的输入文件的,但在读取文件时仍然失败。我需要做什么才能读取文本格式的原始文件?

  • 是一个序列化协议缓冲区,如果不使用,则很难解析。proto/从中编译的类?

  • 在阅读这个相当长的问题之前,我提出了一个bughttps://github.com/GoogleCloudPlatform/python-docs-samples/issues/1103. 原型包和名称解析的留档状态 您可以使用其他定义。通过导入原始文件。导入另一个。在proto的定义中,您可以在文件的顶部添加一条import语句。 我的依赖于annotations.proto将HTTP/JSON

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我想知道的优点和缺点 Google协议缓冲区 JSON格式 XML格式 我想为两个应用程序实现一个通用框架,一个在Perl中,第二个在Java中。因此,希望创