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. Expected MultipartHttpServletRequest: is a MultipartResolver configured解决方案

    异常信息: java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolv ...

  2. Python Django CMDB项目实战之-1如何开启一个Django-并设置base页、index页、文章页面

    1.环境 win10 python 2.7.14 django 1.8.2 需要用到的依赖包:MySQLdb(数据库的接口包).PIL/pillow(处理图片的包) 安装命令: pip install ...

  3. java中的集合操作类(未完待续)

    申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...

  4. 剑指 offer代码解析——面试题39推断平衡二叉树

    题目:输入一颗二叉树的根结点.推断该树是不是平衡二叉树. 假设某二叉树中随意结点的左右子树的高度相差不超过1,那么它就是一棵平衡二叉树. 分析:所谓平衡二叉树就是要确保每一个结点的左子树与右子树的高度 ...

  5. NHibernate3剖析:Configuration篇之SessionFactory lambda配置

    概览 在NHibernate3.0中.SessionFactory的Properties和Cache配置实现了流配置(fluent-configuration)和lambda表达式配置(lambda- ...

  6. Order笔记-项目导入

    问题: @Override报错: @Override注释在jdk1.5环境下只能用于对继承的父类的方法的重写,但不能用于对实现的接口中的方法的实现.(也就是jdk1.5的 @Override这个ann ...

  7. SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL

    前言 通过前面的MyBatis部分学习,已经可以使用MyBatis独立构建一个数据库程序,基本的增删查改/关联查询等等都可以实现了.简单的单表操作和关联查询在实际开的业务流程中一定会有,但是可能只会占 ...

  8. Docker-py 的使用

    Docker SDK for Python A Python library for the Docker Engine API 具体文档这里,https://docker-py.readthedoc ...

  9. .NET开发一个微信跳一跳辅助程序

    昨天微信更新了,出现了一个小游戏"跳一跳",玩了一下 赶紧还蛮有意思的 但纯粹是拼手感的,玩了好久,终于搞了个135分拿了个第一名,没想到过一会就被朋友刷下去了,最高的也就200来 ...

  10. Java8函数之旅 (八) - 组合式异步编程

    前言 随着多核处理器的出现,如何轻松高效的进行异步编程变得愈发重要,我们看看在java8之前,使用java语言完成异步编程有哪些方案. JAVA8之前的异步编程 继承Thead类,重写run方法 实现 ...