我正在使用协议缓冲区,一切正常。除了我不明白的事实--为什么我需要proto
文件中的编号标记:
message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3;
}
我当然读过文件了:
正如您所看到的,消息定义中的每个字段都有一个唯一的编号标记。这些标记用于标识消息二进制格式的字段,一旦您的消息类型被使用,就不应更改。
我不明白如果我改变它又有什么区别。(我将创建一个新的proto并编译它--那么它为什么在乎呢?)
另一条规定:
proto定义中的编号字段省去了对版本检查的需要,这是设计和实现协议缓冲区的明确动机之一。正如开发人员文档所述,协议的设计部分是为了避免像这样的“丑陋代码”来检查协议版本:
if (version == 3) {
...
} else if (version > 4) {
if (version == 5) {
...
}
...
}
问题
是仅仅是我还是完全不清楚?
让我换一种方式问它:
如果我有一个像上面文件一样的proto文件,然后我将它更改为:
message SearchRequest {
required string query = 3; //reversed order
optional int32 page_number = 2;
optional int32 result_per_page = 1;
}
它在乎什么?我重新编译并添加了这个文件(我在上周已经做了很多次了)。
我错过了什么?你能为这个编号的标签提供一个人对人的解释吗?
编号标记用于在序列化和反序列化数据时匹配字段。
显然,如果更改编号方案,并将此更改应用于序列化程序和反序列化程序,则没有问题。
但是,请考虑一下,如果使用第一种编号方案保存数据,并使用第二种方案加载数据,它将尝试将query
加载到result_per_page
中,反序列化可能会失败。
现在,这为什么有用呢?假设在模式已经使用很久之后,您需要向数据中添加另一个字段:
message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3;
optional int32 new_data = 4;
}
因为您显式地给它一个数字,所以反序列化程序仍然能够加载使用旧的编号方案序列化的数据,忽略不存在的数据的反序列化。
试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地
问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa
我正在使用Google Protocol Buffers向服务器发送消息。我对如何发送图像与如何接收图像感到困惑。有关详细信息,请参阅下面的代码,但我的问题是: 我需要base64_decode从未经过base64编码的返回字符串吗,因为它是使用char*和size发送的?也许Google Protocol Buffers处理了这个问题,但我在生成的类中找不到任何证据。 我可能在这里找到了答案,但
两者都是序列化库,由谷歌开发人员开发。他们之间有什么大的区别吗?将使用协议缓冲区的代码转换为使用FlatBuffers需要大量工作吗?
在阅读这个相当长的问题之前,我提出了一个bughttps://github.com/GoogleCloudPlatform/python-docs-samples/issues/1103. 原型包和名称解析的留档状态 您可以使用其他定义。通过导入原始文件。导入另一个。在proto的定义中,您可以在文件的顶部添加一条import语句。 我的依赖于annotations.proto将HTTP/JSON
请注意:虽然这个问题特别提到了Dropwizard,但我相信任何有泽西/JAX-RS经验的人都应该能够回答这个问题,因为我可以想象Dropwizard只是在幕后遵循泽西/JAX-RS约定。 我有一个Dropwizard服务,它用JSON编写,工作非常出色。 现在我想将其切换为读/写二进制数据(以最小化网络带宽)。我看到了Dropwizard Protobuf库,但我对在Dropwizard中实现二