zoukankan      html  css  js  c++  java
  • 浅析protobuf应用

    Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化,常用于RPC 系统(Remote Procedure Call Protocol System)和持续数据存储系统。

    其类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差,类似的还有json、Java的Serializable等。

    很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

    linux环境安装

    1. 下载

    https://github.com/google/protobuf/releases下载protobuf-all-3.5.1.tar.gz

    2. 解压 tar xvf protobuf-all-3.5.1.tar.gz

    3. 编译并安装

    cd protobuf.3.5.1
    ./configure
    make
    make check
    make install

    4. 验证

    protoc --version

    错误及解决方法 :

    protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared 

    错误原因: 

    protobuf的默认安装路径是/usr/local/lib,而/usr/local/lib 不在Ubuntu体系默认的 LD_LIBRARY_PATH 里,所以就找不到该lib 

    解决方法: 

    1). 创建文件 /etc/ld.so.conf.d/libprotobuf.conf,在该文件中输入如下内容: /usr/local/lib   

    2). 执行命令 sudo ldconfig 

    安装完成!

    5. 编译proto文件,生成java文件(自定义文件,有自己的格式,下文会介绍)

    protoc -I=SRC_DIR --java_out=DST_DIR/SRC_DIR/addressbook.proto

    使用上面的命令格式生成编译很好的Java class文件

    SRC_DIR表示生成的java文件存储位置,DST_DIR/SRC_DIR/addressbook.proto,表示编译.proto文件路径

    Window环境安装

    1.下载protobuf

    选择protoc-xxx-win32.zip下载

    2、配置环境变量

    将解压出来的protoc.exe放在一全英文路径下,并把其路径名放在windows环境变量下的path下。

    右键计算机=》属性=》高级系统设置=》环境变量=》Path  添加,值为protoc.exe的路径

    3 .验证

    protoc --version

    4. 编译proto文件,生成java文件(与上面的执行命令都可以)

    proto.exe --java_out=./ ./proto/person.proto

    前面为java文件路径,后面为proto文件路径

     
    下载jar包:protobuf-java-2.5.0.jar.zip

    实例应用 

    编辑proto文件

    syntax="proto2";
    option java_package = "com.protobuftest.protobuf"; 
    option java_outer_classname = "PersonProbuf"; 
     
    message Person 
    { 
      required string name = 1; 
      required int32 id = 2; 
      optional string email = 3; 
     
      enum PhoneType 
      { 
        MOBILE = 0; 
        HOME = 1; 
        WORK = 2; 
      } 
     
      message PhoneNumber
      { 
        required string number = 1; 
        optional PhoneType type = 2 [default = HOME]; 
      } 
     
      repeated PhoneNumber phone = 4; 
     
      message CountryInfo 
      {
              required string name = 1;
              required string code = 2;
              optional int32 number = 3;
      }
    } 
     
    message AddressBook
     { 
      repeated Person person = 1; 
    }

    代码解释:

    syntax="proto2";表明使用protobuf的编译器版本为v2,目前最新版本为V3,规则有所改变。如果不写默认为V2
    java_outer_classname表示生成的java文名:"PersonProbuf";
    java_package 表示将生成的java文件放入指定的package中 "com.protobuftest.protobuf"; 没有自行创建。

    import 当前proto文件导入外部proto文件
    message是Protobuf中的结构化数据,表示声明一个类,即java中的class

     
  • 相关阅读:
    24-反转链表
    23-链表中环的入口节点
    22-链表中倒数第k个节点
    21-调整数组顺序使奇数位于偶数前面
    18-删除链表的节点
    17-打印从1到最大的n位数
    16-数值的整数次方
    15-二进制中1的个数
    14-剪绳子
    13-机器人的运动范围
  • 原文地址:https://www.cnblogs.com/dk2557/p/9959196.html
Copyright © 2011-2022 走看看