• Protobuf使用(一)


    Protobuf使用(一)
     
    前言:
     
        最近由于接手一个支付的SDK项目,他们那边的网络请求和数据解析都与我平常接触的项目不同,数据请求由于保密暂时不能说,但是数据解析用的是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
     
    欢迎大家扫描关注我的微信公众号,我会定期发布一些博客,分享一些知识点
     
     
     
    本文参考资料:
     
     
     

  • 相关阅读:
    Rsync
    SpringCloud-Eureka
    mysql-主从复制
    java中延迟任务的处理方式
    mysql-分组
    rpm相关
    shell中#*,##*,#*,##*,% *,%% *的含义及用法
    cygwin的用途
    cocos2d-lua-win
    ant打包遇到的问题
  • 原文地址:https://www.cnblogs.com/zhengjunfei/p/8252905.html
Copyright © 2020-2023  润新知