我们可以在google协议缓冲区textformat的解析器中调用自定义的回调函数吗?

时间:2014-09-11 08:38:40

标签: c++ parsing data-structures callback protocol-buffers

在谷歌协议缓冲区中,存在消息的文本版本。在解析这个文本消息时,我们可以自己定义回调函数,以便我们可以将解析的信息存储到我们自己的数据结构中吗? 例如,如果我们定义了.proto:

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

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

我们有textformat消息:

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

protobuf编译器生成名为“A”的相应类,名为“B”的类。解析器可以将此文本格式解析为A的实例。但是,如果用户想要定义我们自己的类“A”的版本,或者存在之前使用的A版本。现在我们想通过谷歌协议缓冲区替换旧的交换格式,我们愿意将谷歌协议缓冲区文本格式版本直接解析为旧的数据结构。如果没有,我们首先必须填充生成的数据结构(类“A”),然后将生成的数据结构调整为遗留数据结构。它占用的内存是必要的两倍。它可能比我们想要的效率低得多。 用于集成解析器的传统方法是具有可以回调自定义仿函数的解析器,以适应新的数据结构。 那么,是否存在将自定义回调函数注入文本格式解析器的方法?

1 个答案:

答案 0 :(得分:0)

不,protobuf TextFormat实现不支持此类扩展。

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