协议缓冲区:更改字段名称会破坏消息吗?
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 解组。跨度>
以上是关于协议缓冲区:更改字段名称会破坏消息吗?的主要内容,如果未能解决你的问题,请参考以下文章