zoukankan      html  css  js  c++  java
  • 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
     
    欢迎大家扫描关注我的微信公众号,我会定期发布一些博客,分享一些知识点
     
     
     
    本文参考资料:
     
     
     

  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/zhengjunfei/p/8252905.html
Copyright © 2011-2022 走看看