首页 > 解决方案 > 修改原始 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 无法理解字符串长度。

提前致谢

标签: c++protocol-buffers

解决方案


我认为没有官方的方法可以做到这一点。您可以按照 protobuf ( https://developers.google.com/protocol-buffers/docs/encoding#structure )的编码指南手动执行此操作。

基本上你应该这样做:

  • 从第一位开始解码
  • 解码直到达到 id 的字段号
  • 识别代表 id 的位并将它们替换为您的新(编码!)id

这很糟糕,有几个原因。最重要的是,您的代码必须了解有关消息结构和内容的详细信息(您的 id 的字段编号和数据类型),而这正是您在使用协议缓冲区时要避免的(您总是需要 .proto 文件中的一些信息) )。


推荐阅读