Protobuf使用(一)
 
前言:
 
    最近由于接手一个支付的项目,他们那边的网络请求和数据解析都与我平常接触的项目不同,数据请求由于保密暂时不能说,但是数据解析用的是Protobuf,于是我就顺便看了下Protobuf一些安装、使用的一些的方法,有一些简单的使用新的经验总结,希望能够帮助到大家,不多说,上正文:
 
Protobuf是什么:
 
    本文简单介绍一下Protobuf是什么,它的优缺点,还有如何通过命令生成一个java文件,本次主要是介绍版本2.6.1,Proto2,它还有Proto3,以后的系列慢慢介绍。
    Protocol Buffers是一个跨语言、跨平台的具有可扩展机制的序列化数据工具。也就是说,我在ubuntu下用python语言序列化一个对象,并使用http协议传输到使用java语言的android客户端,java使用对用的代码工具进行反序列化,也可以得到对应的对象。听起来好像跟json没有多大区别。。。其实区别挺多的。
 
    Google说protobuf是smaller,faster,simpler,我们使用google规定的proto协议定义语言,之后使用proto的工具对代码进行“编译”,生成对应的各个平台的源代码,我们可以使用这些源代码进行工作。
 
    比如说程序中生成了一个链表,但是程序退出重启后,还要重新生成链表,有时候,我们很需要上次程序中该链表中记录的数据。这些数据或许是经过很多大量运算生成的,每次都重新生成这些数据的话,需要消耗大量时间。这时候就可以考虑使用protobuf,将其序列化后保存在文件中,下次使用的时候,加载文件,反序列化后就可以直接使用了。
 
    值得注意的是,protobuf是以二进制来存储数据的。相对于JSON和XML具有以下优点:
    1,简洁
    2,体积小:消息大小只需要XML的1/10 ~ 1/3
    3,速度快:解析速度比XML快20 ~ 100倍
    4,使用Protobuf的编译器,可以生成更容易在编程中使用的数据访问代码
    5,更好的兼容性,Protobuf设计的一个原则就是要能够很好的支持向下或向上兼容
 
Mac环境集成Protobuf:
 
    1. 下载protobuf2.6.1:https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
    2. 解压下载的文件
    3. cd到protobuf-2.6.1目录
    4. $./configure
    5. $make
    6. $make check
    7. $sudo make install (需要接着输入密码)
    8. $which protoc
    9. $protoc --version
    PS:(这是集成他的以前的旧版本,最新版本已经更新到3.5.1了,后续博客会接着介绍新版本的使用)
 
-------------------安装完毕-------------------
 
Protobuf 语法格式(Proto2):
 
    我们需要定义一个.proto格式的文件,里面写的才是Protobuf格式的代码,我们先来看看Protobuf支持的数据类型:
    目前Protobuf支持的数据类型和c++和java对应如下:
 
         
 
    我们的.proto的文件示例如下:
 
    syntax = "proto2";
    package xiaomi.gamecenter.milink.msg;
    option java_package = "org.xiaomi.gamecenter.milink.msg";
    option java_outer_classname = "CreateOrderReq";
 
    message OrderReq {
      required string uid = 1;
      optional int32 amount = 2;
      optional int32 resultCode = 3;
    }
 
    OrderReq就是消息的名字,该消息有3个字段,在消息中承载的数据分别对应于每一个字段。其中每个字段都有一个修饰符,一种类型,一个名字和一个编号。
    所指定的字段类型修饰符必须是如下之一:
      required:一个格式良好的消息一定要含有1个这种字段。表示该值是必须要设置的;
      optional:消息格式中该字段可以有0个或1个值(不超过1个),也就是可有可无;
      repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。表示该值可以重复,相当于java中的List。
    注意:第一行必须 (syntax = "proto2";)标识语法格式的版本,之后是包名,java_outer_classname 标识生成的java文件的名称,并且其不能与.proto文件的名称相同,也不能与“message OrderReq”中的“OrderReq”名称相同,否则会报名称错误;
 
Protobuf 命令生成java文件:
 
    protoc --plugin=/usr/local/bin/protoc-gen-objc ./CreateOrderReq.proto --java_out="/Users/zhengjunfei/miui/oauth/sdk_oauth/Plugin/src/"
 
    其中红色字体表示的是.proto文件的路径,绿色字体标明的是输出的java格式文件的路径。其中蓝色的标识的是输出的文件格式,cpp_out、­­java_out、­­python_out命令分别可以生成C++、Java、Python代码。
 
完结:
 
    后续会介绍protobuf的最新版本的使用包括在Android studio中的集成,希望大家能够后续持续关注,并且希望能够给大家提供到帮助,谢谢!
 
 
 
    如要转载,请注明出处,谢谢!
      欢迎关注我的博客园博客,地址是:
      https://www.cnblogs.com/zhengjunfei/
      同时欢迎大家关注我的简书博客,地址是:
    https:www.jianshu.com/u/da06e00edefa
 
欢迎大家扫描关注我的微信公众号,我会定期发布一些博客,分享一些知识点
 
 
 
本文参考资料:
 
 
 

Protobuf使用(一)的更多相关文章

  1. python通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...

  2. Protobuf使用规范分享

    一.Protobuf 的优点 Protobuf 有如 XML,不过它更小.更快.也更简单.它以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍.你可以定义自己的数据结构 ...

  3. java netty socket库和自定义C#socket库利用protobuf进行通信完整实例

    之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C ...

  4. 在Wcf中应用ProtoBuf替代默认的序列化器

    Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...

  5. protobuf的编译安装

    github地址:https://github.com/google/protobuf支持多种语言,有多个语言的版本,本文采用的是在centos7下编译源码进行安装. github上有详细的安装说明: ...

  6. 编译protobuf的jar文件

    1.准备工作 需要到github上下载相应的文件,地址https://github.com/google/protobuf/releases protobuf有很多不同语言的版本,因为我们需要的是ja ...

  7. protobuf学习(2)-相关学习资料

    protobuf官方git地址 protobuf官方英文文档   (你懂的需要FQ) protobuf中文翻译文档 protobuf概述          (官方翻译 推荐阅读) protobuf入门 ...

  8. google protobuf安装与使用

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

  9. c# (ENUM)枚举组合类型的谷歌序列化Protobuf

    c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面: RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru ...

  10. dubbox 增加google-gprc/protobuf支持

    好久没写东西了,今年实在太忙,基本都在搞业务开发,晚上来补一篇,作为今年的收官博客.google-rpc 正式发布以来,受到了不少人的关注,这么知名的rpc框架,不集成到dubbox中有点说不过去. ...

随机推荐

  1. 简单的调用OpenCV库的Android NDK开发 工具Android Studio

    前言 本博客写于2017/08/11, 博主非专业搞安卓开发, 只是工作的需要倒腾了下Android NDK相关的开发, 博文中有什么不正确.不严格的地方欢迎指正哈    本文后续也许还会有删改, 就 ...

  2. struts2捕获action类异常

    首先是STRUTS.XML的配置.重点在于配置文件: <!-- struts2捕获action类异常 -->         <global-results> <resu ...

  3. ajaxFileUpload上传文件简单示例

    写在前面: 上传文件的方式有很多,最近在做项目的时候,一开始也试用了利用jquery的插件ajaxFileUpload来上传大文件,下面,用一个上传文件的简单例子,记录下,学习的过程~~~ 还是老样子 ...

  4. 关于《Head First Python》一书中print_lol()函数的思考

    关于<Head First Python>一书中print_lol()函数的思考 在<Head First Python>第一章中,讲述到Python处理复杂数据(以电影数据列 ...

  5. Swift tableview自带的刷新控件

    import UIKit class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { let ...

  6. iOS UIAlertController中加入倒计时,输入框,Swift讲解

    一.倒计时 @interface ViewController () { UIAlertController *alertview; NSString * message; NSTimer * wai ...

  7. XMPP协议的基本理解

    即时通讯技术简介 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容.大多数常用的即时通讯发送程序都会提 ...

  8. bzoj 3566: [SHOI2014]概率充电器

    Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器:"采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率 ...

  9. bzoj 3531: [Sdoi2014]旅行

    Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...

  10. /sbin/nologin 和 /bin/false 的区别

    /bin/false是最严格的禁止login选项,一切服务都不能用,而/sbin/nologin只是不允许系统login,可以使用其他ftp等服务 如果想要用false在禁止login的同时允许ftp ...