c++ - 修改原始 protobuf 流
问题描述
假设我已经使用以下 proto 文件编译了一个应用程序(接收器):
syntax = "proto3";
message Control {
bytes version = 1;
uint32 id = 2;
bytes color = 3;
}
我有另一个应用程序(发送器),它最初具有相同的原始文件,但在更新后添加了一个新字段,如:
syntax = "proto3";
message Control {
bytes name = 1;
uint32 id = 2;
bytes color = 3;
uint32 color_id = 4;
}
我已经看到,如果 Receiver 应用程序尝试解析 proto,更改一些数据,然后将其序列化回来,来自 Transmitter 应用程序的添加字段将被删除。
我需要一种方法来更改直接访问原始字节的 id 字段,而无需解析/序列化原型。可能吗 ?
这是必需的,因为我在控制消息中有一些“标题”字段,我知道这些字段永远不会更改,但由于应用程序更新,可以在相同的发送器应用程序原型中添加/更改其他字段。
我已经看到:https ://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.coded_stream 但我无法修改现有的字节流并且 ReadString 无法理解字符串长度。
提前致谢
解决方案
我认为没有官方的方法可以做到这一点。您可以按照 protobuf ( https://developers.google.com/protocol-buffers/docs/encoding#structure )的编码指南手动执行此操作。
基本上你应该这样做:
- 从第一位开始解码
- 解码直到达到 id 的字段号
- 识别代表 id 的位并将它们替换为您的新(编码!)id
这很糟糕,有几个原因。最重要的是,您的代码必须了解有关消息结构和内容的详细信息(您的 id 的字段编号和数据类型),而这正是您在使用协议缓冲区时要避免的(您总是需要 .proto 文件中的一些信息) )。
推荐阅读
- javascript - jquery serialize a input array
- algorithm - 最小成本最大流量的最佳算法?
- javascript - 如何通过代码更新 SFCC 中自定义属性(字符串枚举)的值?
- swift - UI 不可滚动
- r - Tidyverse 组功能用于汇总?
- amazon-web-services - 创建 AWS VPC 时出错:创建 VPC 时出错:无法找到 vpc 的主路由表
- python - Python Flask 检测用户在页面上停留了多长时间
- git - git:使用来自主错误的最新更改更新当前开发分支
- css - 使用动态 StyleClass 为 Primefaces 设置 CSS 的特异性
- dialogflow-es - Dialogflow 松弛集成被破坏了?