protobuff协议

1.什么是protobuff协议?
Protobuf(Google Protocol Buffers)是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库.它和XML和Json数据差不多,把数据已某种形式保存起来.Protobuf相对与XML和Json的不同之处,它是一种二进制的数据格式,具有更高的传输,打包和解包效率.
2.protobuf在java方面的应用。
1):下载安装。https://download.csdn.net/download/antgan/9593735
2):配置环境变量。
3)设计对象
。。。。
4)描述对象
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
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 AddressBook {
repeated Person person = 1;
}
4.编译描述
cmd>protoc --java_out . xxx.proto
5.导入源代码到项目中
6.使用对象

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

四、编写.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;//可选字段,在后面的使用中可以自由决定是否为该字段设置值
}

四、使用protoc.exe编译成java类
有两种方法:

  1. 使用Java Rumtime执行cmd命令
  2. 直接打开cmd运行命令也行。

  3. 使用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程序
    }
    }

命令格式如下。

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

  1. 直接打开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("[email protected]");
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());
}

}

输出如下
这里写图片描述

猜你喜欢

转载自www.cnblogs.com/stone-learning/p/9286119.html