在您发布使用Protocol Buffer区的代码后,您迟早会因为业务需求变更想要“改进”Protocol Buffer的定义。如果你想让你的新Protocol Buffer向后兼容,让你的旧Protocol Buffer向前兼容,那么你需要遵守一些规则。在新版本的Protocol Buffer中:

  • 您不能更改任何现有字段的标签号。

  • 您不得添加或删除任何必填字段。

  • 您可以删除可选或重复的字段。

  • 您可以添加新的可选或重复字段,但必须使用新的标签号(即,从未在此Protocol Buffer中使用过的标签号,甚至未被删除的字段使用过)。

  • 当有需要可以在生成的Java类中进行修改

(这些规则有一些例外,但很少使用。)

如果您遵循这些规则,旧代码将无缝兼容新消息,并忽略掉新字段。对于旧代码,被删除的可选字段将只具有它们的默认值,被删除的重复字段将为空。新代码也会透明地读取旧消息。但是,请记住,新的可选字段不会出现在旧消息中,因此您需要显式检查它们是否设置了has_,或者在您的.proto文件中提供一个合理的默认值,在标签号后面加上[default = value]。如果没有为可选元素指定默认值,则使用特定于类型的默认值:对于字符串,默认值为空字符串。对于布尔值,默认值为false。对于数值类型,默认值为零。还要注意,如果您添加了一个新的重复字段,您的新代码将无法判断它是空的(由新代码)还是根本没有设置(由旧代码),因为它没有has_ 标记。

高级用法

Protocol buffer的使用超越了简单的访问器和序列化。请务必浏览一下Java应用编程接口参考,看看您还可以用它们做些什么。

协议消息类提供的一个关键特性是反射。您可以迭代消息的字段和摆布它们的值,而无需针对任何特定的消息类型编写代码。使用反射的一个非常有用的方法是将协议消息转换成其他编码,如XML或JSON。反射的一个更高级的用途可能是发现相同类型的两个消息之间的差异,或者开发一种“协议消息的正则表达式”,在这种表达式中,您可以编写与某些消息内容匹配的表达式。如果你运用你的想象力,就有可能将Protocol Buffers应用到比你最初预期的更广泛的问题上!

反射是作为消息和Message.Builder接口的一部分提供的。

十四.Protobuf3扩展的更多相关文章

  1. PostgreSQL Replication之第十四章 扩展与BDR

    在这一章中,将向您介绍一个全新的技术,成为BDR.双向复制(BDR),在PostgreSQL的世界里,它绝对是一颗冉冉升起的新星.在不久的将来,许多新的东西将会被看到,并且人们可以期待一个蓬勃发展的项 ...

  2. Robot Framework(十四) 扩展RobotFramework框架——创建测试库

    4.1创建测试库 Robot Framework的实际测试功能由测试库提供.有许多现有的库,其中一些甚至与核心框架捆绑在一起,但仍然经常需要创建新的库.这个任务并不复杂,因为正如本章所示,Robot ...

  3. Chrome浏览器扩展开发系列之十四

    Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 时间:2015-10-08 16:17:59      阅读:1361      评论:0      收藏:0    ...

  4. NeHe OpenGL教程 第二十四课:扩展

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. Chrome浏览器扩展开发系列之十四:本地消息机制Native messagin

    Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 2016-11-24 09:36 114人阅读 评论(0) 收藏 举报  分类: PPAPI(27)  通过将浏览器 ...

  6. 无废话ExtJs 入门教程十四[文本编辑器:Editor]

    无废话ExtJs 入门教程十四[文本编辑器:Editor] extjs技术交流,欢迎加群(201926085) ExtJs自带的编辑器没有图片上传的功能,大部分时候能够满足我们的需要. 但有时候这个功 ...

  7. SNF开发平台WinForm之十四-站内发送系统信息-SNF快速开发平台3.3-Spring.Net.Framework

    1运行效果: 2开发实现: .组装站内信息发送实体对象. SNFService SNFService = new SNFService(); if (this.ucUser.SelectedIds ! ...

  8. NeHe OpenGL教程 第四十四课:3D光晕

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. javaSE第二十四天

    第二十四天    363 1:多线程(理解)    363 (1)JDK5以后的Lock锁    363 A:定义    363 B:方法:    364 C:具体应用(以售票程序为例)    364 ...

随机推荐

  1. SpringBoot常用注解(三)

    最全的Java常用开发注解 转   https://blog.csdn.net/weixin_40753536/article/details/81285046              Spring ...

  2. String字符串相关操作

    .length 字符串长度.equals 比较字符串.equalIgnoreCase 比较字符串不区别大小写.charAt 获取字符串指定下标位置的字符.contains 判断字符串内是否包含某字符串 ...

  3. Linux定时自动备份oracle数据库

    1.在服务器创建备份目录,并赋予权限mkdir -p /backup/P_DATA #新建shell脚本存放路径mkdir -p /backup/P_DB_BACK  #新建Oracle数据库备份目录 ...

  4. LeetCode 32. 最长有效括号(Longest Valid Parentheses) 31

    32. 最长有效括号 32. Longest Valid Parentheses 题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 每日一算法2019/6/ ...

  5. [转帖]推荐一款比 Find 快 10 倍的搜索工具 FD

    推荐一款比 Find 快 10 倍的搜索工具 FD https://www.hi-linux.com/posts/15017.html 试了下 很好用呢. Posted by Mike on 2018 ...

  6. Word样式教程

    目录 写在前面 样式可以解决什么问题? 本文适合于 快速入门 一切皆样式 样式与格式的关系 如何修改样式 建立新的样式 样式的匹配和更新 根据样式更新所选段落 根据所选段落更新样式 小结 进一步了解 ...

  7. XGBoost对波士顿房价进行预测

    import numpy as np import matplotlib as mpl mpl.rcParams["font.sans-serif"] = ["SimHe ...

  8. 使用PHP开发HR系统(4)

    本节我们讲述如何引入页面框架来建立漂亮的主页. ============================================================================ ...

  9. python爬虫-80电子书,爬图片

    ''' 作者:Caric_lee 日期:2018 查看图片 ''' import requests from bs4 import BeautifulSoup r = requests.get(&qu ...

  10. 报告题目:HAO智能:HI + AI + OI

     报告题目:HAO智能:HI + AI + OI 报告摘要:大数据面向异构自治的多源海量数据, 旨在挖掘数据间复杂且演化的关联.大数据知识工程(BigKE)从大数据的 HACE定理开始, 从大知识建模 ...