【发布时间】:2018-08-05 01:49:06
【问题描述】:
假设我已经使用以下 proto 文件编译了一个应用程序(接收器):
syntax = "proto3";
message Control {
bytes version = 1;
uint32 id = 2;
bytes color = 3;
}
我有另一个应用程序(传输器),它最初具有相同的 proto 文件,但在更新后添加了一个新字段,如:
syntax = "proto3";
message Control {
bytes name = 1;
uint32 id = 2;
bytes color = 3;
uint32 color_id = 4;
}
我已经看到,如果 Receiver 应用程序尝试解析 proto,更改一些数据,然后将其序列化回来,来自 Transmitter 应用程序的添加字段将被删除。
我需要一种方法来更改直接访问原始字节的 id 字段,而无需解析/序列化 proto。有可能吗?
这是必需的,因为我在控制消息中有一些“标题”字段,我知道这些字段永远不会更改,但由于应用程序更新,可以在相同的传输器应用程序原型中添加/更改其他字段。
我见过:https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.coded_stream 但我无法修改现有的字节流,并且 ReadString 无法理解字符串长度。
提前致谢
【问题讨论】:
-
如果您使用的是 protobuf 2 或 3.5+ developers.google.com/protocol-buffers/docs/proto3#unknowns,应该可以正常工作
-
请问您确切地指出您使用的是哪个版本?从 v3.5.0 开始,C++ 应该默认为 proto3 保留未知字段...(这是 proto2,IIRC 中的旧行为)
标签: c++ protocol-buffers