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. 【转】15个必须知道的chrome开发者技巧

    一.快速切换文件 如果你使用过sublime text,那么你可能不习惯没有Go to anything这个功能的覆盖.你会很高兴听到chrome开发者功能也有这个功能,当DevTools被打开的时候 ...

  2. ASP.NET Core Startup类 Configure()方法 | ASP.NET Core 中间件详细说明

    ASP.NET Core 程序启动过程如下 目录 Startup 类 Configure() 方法 中间件 使用中间件 Configure 方法 的参数 IApplicationBuilder Ext ...

  3. ZT 获得/修改共享互斥量属性:pthread_mutexattr_t

    bbs.chinaunix.net/thread-965755-1-1.html 5.   获得/修改共享互斥量属性:    #include<pthread.h>    intpthre ...

  4. java内部类之成员内部类

    内部类概念:顾名思义,就是将一个类定义在另一个个类内部.内部的类称之为内部类 . 内部类的主要特点:1.内部类可以很好的实现隐藏,可以使用protected.private修饰符.2.内部类可以直接访 ...

  5. SEO搜索引擎优化(转)

    (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.s ...

  6. Tableau10.4中智能显示点击后消失的解决方案

    如果你的电脑是Win10,并且是高分屏,可能会出现和我一样的问题,就点击智能显示后,发现找不到了. 那么解决方案就是: 这样就能找到智能显示了.

  7. 1、Python代码初识

    由于python2.7版本默认使用的是ASCII码,必须在编写前加入两行代码,表示使用UTF-8码. #!/usr/bin/python # -*- coding:utf-8 -*- print('你 ...

  8. SHA1WithRSA

    SHA1WithRSA:用SHA算法进行签名,用RSA算法进行加密.   算法说明: 在对进行SHA1算法进行签名后,要求对签名后的数据进行处理,而不是直接进行RSA算法进行加密. 要求把SHA1签名 ...

  9. 【[HNOI2008]GT考试】

    我又来复习\(kmp\)了 其实这道题主要是一个矩阵乘法,但是\(kmp\)在其中也有着非常重要的作用 我们可以这样定义状态\(dp[i][j]\)表示文本串进行到了\(i\)位置,同时文本串在最后和 ...

  10. Git创建本地分支并关联远程分支

    创建本地分支git branch 分支名 例如:git branch dev,这条命令是基于当前分支创建的本地分支,假设当前分支是master(远程分支),则是基于master分支创建的本地分支dev ...