当前位置: 首页 > 知识库问答 >
问题:

更改协议缓冲区中字段的数据类型

左丘智渊
2023-03-14

嗨,为了保持向后兼容性,可以更改协议缓冲区中字段的数据类型吗。例如

旧消息

message Connection{
       optional string wifi = 1;
       optional int32 wifiCode = 2;
}

**new message**

message Connection{

     message wifiConnection{
         optional string name = 1;
         optional int32 code = 2;
     }

     optional wifiConnection wifi = 1;
}

所以基本上我没有更改字段的标签号,也没有重命名它,但我更改了数据类型。那么这是向后兼容的吗?如果一个应用程序获得了一个用以前的模式创建的旧proto对象,它可以通过这个新模式创建的对象进行解析吗?

共有1个答案

景阳平
2023-03-14

不,它不会向后兼容。Protcol缓冲区存储的数据大致如下

Code1 + wire-type1 + {Data1}
Code2 + wire-type2 + {Data2}
Code3 + wire-type3 + {Data3}

因此,第一个旧格式将存储为

1 + wire-type {Wifi-Data}
2 + wire-type {Wifi-Code-Data}

新消息将被存储为

1 + wire-type { 
               1 + wire-type {Wifi-Data}
               2 + wire-type {Wifi-Code-Data}
}    
 类似资料:
  • 我不小心安装了3.0.0版,我的大多数文件自然产生了大量错误。现在我想把它带回2.6.1。我已经下载了2.6.1并安装了,但是当我做时,它仍然显示,这是错误的。 有办法将版本设置为2.6.1还是有办法卸载3.0.0?

  • 试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地

  • 我正在尝试更新Android BluetoothChat示例的代码,以使用Protobuf进行更结构化的数据交换。我还需要byte[]数组字段来发送任意数据,如图像字节数组,但在尝试编译时。proto文件,我得到以下错误。 协议文件/蓝牙消息。proto:8:18:应为字段名。 下面是我的. proto文件。 stackoverflow上的其他几个帖子提到byte[]可以用作文件,下面的页面也说了

  • 我正在使用Google Protocol Buffers向服务器发送消息。我对如何发送图像与如何接收图像感到困惑。有关详细信息,请参阅下面的代码,但我的问题是: 我需要base64_decode从未经过base64编码的返回字符串吗,因为它是使用char*和size发送的?也许Google Protocol Buffers处理了这个问题,但我在生成的类中找不到任何证据。 我可能在这里找到了答案,但

  • 我有一个二进制数据缓冲区,我想存储在协议缓冲区中。 在留档(https://developers.google.com/protocol-buffers/docs/proto#scalar)中,它说类型等价于C中的。我无法相信这一点,所以我不得不尝试它,是的,这似乎是这样... 本协议: 给出一个包含以下内容的消息定义: 公共setter/getter API如下所示: 当然,这不是在消息中存储二

  • 问题内容: 我正在尝试在Linux平台上探索协议缓冲区(PB),我的编码语言是C ++。我在协议缓冲区在线文档中找到了示例,但没有特定于套接字发送和接收的内容(或者我完全错过了:))。因此,我决定在实际消息之前添加消息Length,并通过套接字发送它。如果有人可以提出比我计划做的更好的解决方案,并且在PB中已经准备好任何用于创建此类数据包的东西,我将不胜感激。 但是我仍然在服务器端遇到问题,必须对