Google protobuf是非常出色的开源工具,在项目中可以用它来作为服务间数据交互的接口,例如rpc服务、数据文件传输等。protobuf为proto文件中定义的对象提供了标准的序列化和反序列化方法,可以很方便的对pb对象进行各种解析和转换。以下是我总结的protobuf使用技巧和经验,分享给大家。由于公众号尚未开通评论功能,抱歉暂时还不能评论交流。

技巧1:使用optional而不是required字段。

protobuf的可选字段optional是一个很巧妙的设计,optional字段是可选的,一个optional字段存在与否都不影响proto对象的序列化和反序列化,利用它可以实现数据协议的向后兼容和向前兼容,即以后增加新的字段,或弃用(注意这里是弃用而不是删除)旧字段都不需要修改代码。

相比optional字段,requried字段要求字段必须存在,否则会导致proto解析失败。一旦某个字段被设计为requried类型,将来随着业务的快速发展可能会成为负担,因此在使用requried类型时一定要慎重。

技巧2:使用bytes而不是string字段。

这个技巧要感谢身边好同事的建议和提醒,protobuf的bytes和string都能表示字符串,但是string类型会对字符串做utf8格式校验,而bytes不会,因此使用bytes的编解码效率更高。

技巧3:尽可能只维护一份proto文件。

世界上唯一不变的事情就是永远在发生变化,精心设计好的proto文件也会随着业务发展而改变。因此,工程中不提倡拷贝分发proto文件,而应通过提供git地址的方式只维护一份proto文件。

技巧4:尽可能减少对其他proto文件的依赖。

proto应尽量独立,在某些编程语言如lua中是不支持proto中嵌套其他proto这种方式的,需要手动修改以剔除外部proto依赖,或采用其他办法解决。另外,减少对其他proto文件的依赖也有利于对proto的查看和理解。

技巧5:利用开源工具实现proto和json的转换。

protobuf的二进制可读性不好,远不如json的可读性,工程中有很多地方都会涉及proto和json之间的转换。假如你手头上有一个很好用的json开发接口,现在要实现proto和json之间的相互转换,一定要抵制住造轮子的冲动,而应该去找找json2pb这样的开源工具。开源工具只需要几行代码就能搞定这样的需求,又好又快,既能提高工作效率,又可以保证质量。

更多技巧: 网上还有一些很好的关于protobuf的文章,例如protobuf和thrift之间的优缺点对比,protobuf的int压缩设计,protobuf的使用例子,以及lua中解决proto文件嵌套其他proto文件的解决方法等等。学无止境,唯有一生勤勉。

金句分享

开始时,我并不指望能够学到多少东西。可是,读完这本书后,我发现,我激励自己的方式无意中促成了自我憎恨。由于认为自己"应该"做到许多事情,我不停的指责自己、命令自己、要求自己。这不可避免地导致内在的分裂与不满。

——摘自《非暴力沟通》的“译序”,作者马歇尔·卢森堡博士,译者阮胤华。

Google protobuf使用技巧和经验的更多相关文章

  1. 在UnrealEngine4中使用Google Protobuf

    转自:https://blog.csdn.net/or_7r_ccl/article/details/54986393 在UnrealEngine4中使用Google Protobuf         ...

  2. google protobuf安装与使用

    google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google protobuf是跨语言的,并且自带了一个编译器( ...

  3. VS2013编译google protobuf 出现问题error C3861: “min”:

    问题描述: 今天用vs2013编译protobuf 2.4.1 报错: 错误 3 error C3861: "max": 找不到标识符 f:\google\protobuf\pro ...

  4. google protobuf初体验

    最近在读别人代码的时候发现一个的东西,名字叫protobuf, 感觉挺好用的,写在这里,留个记录.那么什么是protobuf 呢?假如您在网上搜索,应该会得到类似这样的文字介绍: Google Pro ...

  5. Google protobuf proto文件编写规则

    转载自: http://blog.csdn.net/yi_ya/article/details/40404231 1. 简单介绍 protobuf文件:就是定义你要的消息(类似java中的类)和消息中 ...

  6. window下编译并使用google protobuf

    参考网址: http://my.oschina.net/chenleijava/blog/261263 http://www.ibm.com/developerworks/cn/linux/l-cn- ...

  7. GOOGLE PROTOBUF开发者指南

    原文地址:http://www.cppblog.com/liquidx/archive/2009/06/23/88366.html 译者: gashero 目录 1   概览 1.1   什么是pro ...

  8. google protobuf ios开发使用

    简介: protobuf 即 google protocol buffer 是一种数据封装格式协议: 比如其他经常用的xml,json等格式:protobuf的优势是效率高,同样的一份数据使用prot ...

  9. 如何使用GOOGLE高级搜索技巧

    如何使用GOOGLE高级搜索技巧 一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发 ...

随机推荐

  1. Effective C++(5) 了解C++默默地编写并调用哪些函数

    预热: 一个空的类,当编译器处理过之后,就包含: 一个copy构造函数 一个重载赋值操作符 一个析构函数 一个默认构造函数 Demo: class Empty() { }; // 声明一个空的类 cl ...

  2. Linux server配置安装Java,Tomcat服务器

    系统:Ubuntu 16.04 dev_desktop 1.Java安装并配置环境变量 (1)从Java官方网站下载最新版JDK: http://www.oracle.com/technetwork/ ...

  3. java二维数组定义初始化-杨辉三角

    public class Array2Demo2_3 { public static void main(String[] args) { //定义初始化 int[][] arr = new int[ ...

  4. poj3718 Facer's Chocolate Dream

    题目链接 正解:组合数+$dp$. 今天考试的题,考试的时候感觉自己有点脑残过头了.. 似乎发现了所有$1$其实都是一样的,然后不知道怎么强制每种物品只选一个.. 然后就写了一个所有物品可以选任意个的 ...

  5. java @XmlTransient与@Transient区别

    1.@XmlTransient a.@XmlTransient 注解解决 JavaBean 属性名称与字段名称之间的名称冲突,或者用于防止字段/属性的映射 b.阻止将 JavaBean 属性映射到 X ...

  6. TensorFlow函数(五)参数初始化方法

    1.初始化为常量 tf.constant_initializer(value, dtype) 生成一个初始值为常量value的tensor对象 value:指定的常量 dtype:数据类型 tf.ze ...

  7. win10里如何在中文输入法里添加美式键盘

    在控制面板打开“时钟.语言和区域”设置界面,选中“语言”设置  “语言”设置里点击“添加语言” 在添加语言设置里选择“英语”,并点击“打开”按钮,在“区域变量”设置页面里选择“英语(美国)” ,并点击 ...

  8. Kali-linux使用OpenVAS

    OpenVAS(开放式漏洞评估系统)是一个客户端/服务器架构,它常用来评估目标主机上的漏洞.OpenVAS是Nessus项目的一个分支,它提供的产品是完全地免费.OpenVAS默认安装在标准的Kali ...

  9. coco定义的小物体中物体大物体的尺寸

    http://cocodataset.org/#detection-leaderboard

  10. pass语句

    Python pass是空语句,是为了保持程序结构的完整性.  pass 不做任何事情,一般用做占位语句. #!/usr/bin/python # -*- coding: UTF-8 -*- # 输出 ...