Protobuf3 更新消息类型

如果现有的消息类型不满足你的所有需求——例如,你希望消息格式有一个额外的字段——但是你仍然希望使用用旧格式创建的代码,别担心!在不破坏任何现有代码的情况下更新消息类型非常简单。请记住以下规则:

不要更改任何现有字段的字段编号。

如果添加新字段,任何使用“旧”消息格式由代码序列化的消息仍然可以被新生成的代码解析。您应该记住这些元素的默认值,以便新代码可以与旧代码生成的消息能够正确交互。同样,新代码创建的消息可以被旧代码解析:旧二进制文件在解析时忽略新字段。

未知字段是格式良好的协议缓冲区序列化数据,用于表示解析器无法识别的字段。例如,当旧二进制解析新二进制发送的带有新字段的数据时,这些新字段将成为旧二进制中未知的字段。

最初,proto3消息在解析过程中总是丢弃未知字段,但是在3.5版中,我们重新引入了未知字段的保留以匹配proto2行为。在3.5及更高版本中,未知字段会在解析期间保留,并包含在序列化输出中。

只要更新的消息类型中不再使用字段号,就可以删除字段。您可能希望重命名该字段,也许添加前缀 "OBSOLETE_",或者保留字段号,以便将来你.proto不会意外地被其他用户重复使用。

int32, uint32, int64, uint64和bool都是兼容的——这意味着您可以将字段从这些类型中的一种更改为另一种类型,而不破坏向前或向后兼容性。如果从不适合相应类型中的字段中解析出一个数字,你将会得到与用c++将该数字转换为该类型相同的效果(例如,如果int64数字被解析为int32,它将被截断为32位)。

sint32 和sint64 彼此兼容,但与其他整数类型不兼容。只要字节是有效的UTF - 8,字符串和字节是兼容的。

如果字节包含消息的编码版本,则嵌入消息与字节兼容。

fixed32与sfixed32兼容, fixed64与sfixed64兼容。

enum与int32、uint32、int64和uint64在电线格式条款兼容(请注意,如果这些值不匹配,它们将被截断)。然而,请注意,当消息被反序列化时,客户端代码可能会以不同的方式对待它们:例如,无法识别的proto3枚举类型将保留在消息中,但是当消息被反序列化时,这是如何表示的取决于语言,int字段总是保留其值。

将单个值更改为新值的成员是安全的,并且是二进制兼容的。如果您确定没有代码一次设置多个字段,将多个字段移动到新的字段可能是安全的,将任何字段移动到现有字段中是不安全的。

八.Protobuf3更新消息类型(添加新的字段)的更多相关文章

  1. gRPC in ASP.NET Core 3.x -- Protocol Buffer(3)更新消息类型

    当你第一次定义Protocol Buffer的消息的时候,你肯定会给消息设定一套规则需求.但是随着时间的推进,你的业务可能会发生了变化,与此同时,你的Protocol Buffer消息类型的需求也会随 ...

  2. Language Guide (proto3) | proto3 语言指南(七)更新消息类型

    Updating A Message Type - 更新消息类型 如果现有的消息类型不再满足您的所有需要(例如,您希望消息格式有一个额外的字段),但是您仍然希望使用用旧格式创建的代码,不要担心!在不破 ...

  3. ASP.NET Core 中文文档 第二章 指南(4.8)添加新的字段

    原文 Adding a New Field 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).高嵩(Jack) 在这个章节你将使用 Entity Framework ...

  4. EF中如何为表添加新的字段和映射

    首先先了解一下ef生成的模型edmx的代码,传送门:http://www.cnblogs.com/yushengbo/p/4807715.html 一.添加新的字段 例子就用我现在项目的这个吧,首先在 ...

  5. SQLite添加新的字段

    通过alter添加新的字段SQL语句 "ALTER TABLE 'DiHKChatMessage' ADD 'phoneNum' varchar"; 但是如果这个字段已经存在的话, ...

  6. mssql sqlserver 给已存在表添加新的字段及字段备注的方法

    转自:http://www.maomao365.com/?p=8102 摘要: 下文讲述向已存在表上添加新字段及字段备注的方法,如下所示: 实验环境:sql server 2008 R2 1. 添加新 ...

  7. 如何使用django操作数据库,向原有表中添加新的字段信息并建立一个多对多的关系?

    (注:本人用的pycharm开发工具) 1.在你要添加新字段的app的 models.py 文件中添加需要新增的字段(book表新增authors字段并和author建立多对多关系,author表新增 ...

  8. js 给json添加新的字段,或者添加一组数据,在JS数组指定位置删除、插入、替换元素

    JS定义了一个json数据var test={name:"name",age:"12"};需要给test再添加一个字段,需要什么办法,可以让test的值为{na ...

  9. Qt+QGIS二次开发:向shp矢量图层中添加新的字段

    添加一个新的字段到shp文件中,并且从Excel里导入数据到该字段.原shp文件里的字段ID应该与Excel里的字段ID一一对应才能正确的导入.下图分别是shp的字段和Excel的字段 将class字 ...

随机推荐

  1. 2019秋季PAT甲级_C++题解

    2019 秋季 PAT (Advanced Level) C++题解 考试拿到了满分但受考场状态和知识水平所限可能方法不够简洁,此处保留记录,仍需多加学习.备考总结(笔记目录)在这里 7-1 Fore ...

  2. Django学习之django自带的contentType表

    Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/aar ...

  3. Springboot 整合ApachShiro完成登录验证和权限管理

    1.前言 做一个系统最大的问题就是安全问题以及权限的问题,如何正确的选择一个安全框架对自己的系统进行保护,这方面常用的框架有SpringSecurity,但考虑到它的庞大和复杂,大多数公司还是会选择 ...

  4. 自建Git服务Gogs和CI/CD服务Drone

    自建Git服务Gogs和CI/CD服务Drone 项目:https://gogs.io Gogs运行 docker run -d --name=gogs -p 10022:22 -p 10088:30 ...

  5. Java中关于Math的几个取整方法的区别

    1.Math.ceil()   向上取整 System.out.println(Math.ceil(3.4)); //输出4 System.out.println(Math.ceil(3.7)); / ...

  6. Java 之 函数式接口

    函数式接口 一.概念 函数式接口在 java 中是指:有且仅有一个抽象方法的接口. 函数式接口,即适用于函数式编程场景的接口. 而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用 ...

  7. JavaScript函数参数传递

    Hello,今天和大家分享下JS中的一个基本概念:函数参数传递! 先来看看一个DEMO var str="hello world"; function func(s){ s=&qu ...

  8. maccms 山寨站点 V10 后门

    经验证:www.maccmsv10应该是个山寨站 -------------------- 前言 苹果CMS是国内优秀的开源PHP建站系统,擅长电影程序影视系统这一块,在主流建站系统中特色鲜明,以灵活 ...

  9. app后端设计(php)

    来源:http://blog.csdn.net/column/details/mobilebackend.html?page=1 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经 ...

  10. [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)

    来源:http://bbs.9ria.com/thread-102037-1-1.html 最近看到本版块的很多关于NativeExtension的应用.但是都是在Android下面的应用.也有很多朋 ...