zoukankan      html  css  js  c++  java
  • Protobuf协议的Java应用例子

    Protobuf协议,全称:Protocol Buffer 它跟JSON,XML一样,是一个规定好的数据传播格式。不过,它的序列化和反序列化的效率太变态了……

    来看看几张图你就知道它有多变态。 这里写图片描述

    这里写图片描述

    这里写图片描述


    Protobuf的Java实例

    一、 安装Protobuf

    去Protobuf的GitHub下载,解压。

    如果你是Windows环境,则还要下载多一个东西。protobuf-2.5.0-windows.zip

    解压protobuf-2.5.0-windows.zip,把protoc.exe放在Protobuf安装目录下的src里。(其实放哪都可以)

    二、 配置环境变量

    编辑系统变量Path,添加Protoc.exe的存放目录。 这里写图片描述

    三、 Eclipse新建项目

    我使用maven构建protobuf项目,方便引入protobuf-java-2.5.0.jar依赖。 在项目根目录创建proto文件夹,存放proto文件。 这里写图片描述 maven依赖pom.xml

    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>2.5.0</version>
    </dependency>
    • 1
    • 2
    • 3
    • 4
    • 5

    四、编写.proto文件

    在proto文件夹下编写person-entity.proto,如下(proto协议的规则点这查看

    option java_outer_classname = "PersonEntity";//生成的数据访问类的类名  
    message Person {  
      required int32 id = 1;//同上  
      required string name = 2;//必须字段,在后面的使用中必须为该段设置值  
      optional string email = 3;//可选字段,在后面的使用中可以自由决定是否为该字段设置值
    }  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    四、使用protoc.exe编译成java类

    有两种方法: 1.  使用Java Rumtime执行cmd命令 2.  直接打开cmd运行命令也行。


    1.  使用Java Rumtime执行cmd命令

    util包下新建GenerareClass类 这里写图片描述

    /**
     * protoc.exe
     * @author ganhaibin
     *
     */
    public class GenerateClass {
        public static void main(String[] args) {
            String protoFile = "person-entity.proto";//  
            String strCmd = "d:/dev/protobuf-master/src/protoc.exe -I=./proto --java_out=./src/main/java ./proto/"+ protoFile;  
            try {
                Runtime.getRuntime().exec(strCmd);
            } catch (IOException e) {
                e.printStackTrace();
            }//通过执行cmd命令调用protoc.exe程序  
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    命令格式如下。

    protoc.exe -I=proto的输入目录 --java_out=java类输出目录 proto的输入目录包括包括proto文件
    • 1

    2. 直接打开cmd运行命令

    这里写图片描述

    生成的PersonEntity.java类

    这里写图片描述


    五、测试

    编写Test类,模拟序列化和反序列化过程。

    public class Test {
        public static void main(String[] args) throws IOException {
            //模拟将对象转成byte[],方便传输
            PersonEntity.Person.Builder builder = PersonEntity.Person.newBuilder();
            builder.setId(1);
            builder.setName("ant");
            builder.setEmail("ghb@soecode.com");
            PersonEntity.Person person = builder.build();
            System.out.println("before :"+ person.toString());
    
            System.out.println("===========Person Byte==========");
            for(byte b : person.toByteArray()){
                System.out.print(b);
            }
            System.out.println();
            System.out.println(person.toByteString());
            System.out.println("================================");
    
            //模拟接收Byte[],反序列化成Person类
            byte[] byteArray =person.toByteArray();
            Person p2 = Person.parseFrom(byteArray);
            System.out.println("after :" +p2.toString());
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    输出如下 这里写图片描述


    后记

    我想,拿protobuf协议储存数据,或者作为聊天文本的传输协议,那效率肯定让人咋舌。嘿嘿。

  • 相关阅读:
    数据库 MySQL part4
    数据库 MySQL part3
    win64 Python下安装PIL出错解决2.7版本 (3.6版本可以使用)
    Python3.6 安装、后续终端pip 安装模块命令
    Python for循环文件
    Python遍历字典dict的几种方法
    Python 模块xml
    Socket 是嘛玩意儿(简单聊聊)
    Python高阶函数(Map、Reduce、Filter)和lambda函数一起使用 ,三剑客
    异步加载数据
  • 原文地址:https://www.cnblogs.com/firstdream/p/8269459.html
Copyright © 2011-2022 走看看