协议缓冲区:更改字段名称会破坏消息吗?

Posted

技术标签:

【中文标题】协议缓冲区:更改字段名称会破坏消息吗?【英文标题】:Protocol buffer: does changing field name break the message? 【发布时间】:2017-08-01 07:36:53 【问题描述】:

使用协议缓冲区,更改消息的字段名称是否仍然让它向后兼容?我找不到任何关于此的引用。

例如:原始消息

message Person 
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

改为:

message Person 
  required string full_name = 1;
  required int32 id = 2;
  optional string email = 3;

【问题讨论】:

【参考方案1】:

更改字段名称不会影响 protobuf 编码或使用仅字段名称不同的 proto 定义的应用程序之间的兼容性。

二进制 protobuf 编码是基于标签号的,所以这是你需要保留的。

您甚至可以在一定程度上更改字段类型(查看https://developers.google.com/protocol-buffers/docs/encoding#structure 的类型表),前提是其接线类型保持不变,但这需要额外考虑,例如,将uint32 更改为uint64 是否是从您的应用程序代码的角度来看是安全的,并且对于“更好”的某些定义,比简单地定义一个新字段要好。

如果您使用该功能,更改字段名称将影响 json 表示。

【讨论】:

当消息存储在Any 中时,您知道如何处理更改消息名称吗? 它不会影响线路上消息的形状(字节的位置和长度以及它们对应的字段),但是如果消费者在不更新源的情况下更新 .proto 模式代码,代码不会中断,因为代码通过字段名称访问字段吗?或者有没有办法在访问特定字段时不使用字段名称? (例如,如果用于提取 name 字段并将其写入数据库的代码,它现在如何知道在不更改源代码的情况下提取 full_name 字段?) 代码不会编译,但没关系。 protobuf 的目的是确保没有更新 proto 文件的旧客户端仍然可以工作。 另外请注意,虽然二进制格式不关心字段名称,但如果您将 protobuf 用于 Web API 并且还支持 JSON,那么重命名的字段会破坏 JSON 解组。跨度>

以上是关于协议缓冲区:更改字段名称会破坏消息吗?的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer------基本操作

谷歌协议缓冲区中的未知扩展

更改 django 在显示表单错误消息时使用的字段名称

协议缓冲区:将字段类型从字符串更改为字符串值向后兼容?

mysql怎么更改字段名

为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]