Java中使用ProtoBuf文件

230人浏览 / 0人评论

一、定义proto文件

proto文件需要先指定什么版本,如果要转成java对象,可以指定输出的类名,以及包名,例如:

syntax = "proto3";
option java_package = "com.demo";
option java_outer_classname = "DemoVo";
message Demo{
    string area = 1;
    string country = 2;
    string fudid = 3;
    string timezone = 4;
    string screen = 5;
    string imsi = 6;
    int32 cumulative = 7;
    string osver = 8;
    string irReport = 9;
    string mac = 10;
    string manufacturer = 11;
    string carrier = 12;
    string sysua = 13;
    string dev = 14;
    string producer = 15;
    string client = 16;
    string imei = 17;
    string adrf = 18;
    string model = 19;
    string sn = 20;
    string _id = 21;
    string aid = 22;
}

数据类型主要有string和int32(使用可变长度编码。编码负数的效率低 - 如果你的字段可能有负值,请改用 sint32 ),每个字段指定顺序,从1开始,另外proto3之后就不需要指定字段是不是必填还是可选的,默认都是option(可选的)。

二、转成java对象

1、下载protobuf

从github上下载protobuf:https://github.com/protocolbuffers/protobuf/releases,这里下载最新版3.9.0,需要注意的是这里使用v3.9.0来转java对象,那么在项目中就需要v3.9.0的maven模块来解析,引入的jar模块需要与生成的对象一致

下载地址:https://github.com/protocolbuffers/protobuf/releases/download/v3.9.0/protoc-3.9.0-win64.zip

2、生成java对象

解压下载的程序,进入bin目录下,执行:protoc --java_out=./ Uid.proto,成功后会在当前目录下生成一个指定目录下载UidVo对象

3、java项目中使用

3.1、maven引入(版本都是3.9.0)

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.9.0</version>
</dependency>
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java-util</artifactId>
    <version>3.9.0</version>
</dependency>

3.2、序列化

使用protobuf序列化为byte[]

DemoVo.Demo.Builder builder = DemoVo.Demo.newBuilder();
        builder.setArea("北京")
                .setCountry("460")
                .setFudid("8dbae17436943794349434942016c33e88b086d149c70ec74e0dc01f0685db51")
                .setTimezone("28800")
                .setScreen("720*1280")
                .setImsi("460027433867151")
                .setCumulative(0)
                .setOsver("4.4.4")
                .setIrReport("1")
                .setMac("f4:8b:32:11:ef:c5")
                .setManufacturer("Xiaomi")
                .setCarrier("02")
                .setSysua("Dalvik/1.6.0 (Linux; U; Android 4.4.4; Xiaomi HM NOTE 1S MIUI/4.11.17)")
                .setDev("HM NOTE 1S")
                .setProducer("gucci")
                .setClient("aphone")
                .setImei("867822025664938")
                .setAdrf("1")
                .setModel("HM NOTE 1S")
                .setSn("35e65876a7b")
                .setAid("16c57e8b92dac758");

        DemoVo.Demo demo = builder.build();
        //序列化
        byte[] bytes = demo.toByteArray();

然后可以调用redis.set(byte[]key,bytes)存入到redis中

3.3、反序列化为对象

DemoVo.Demo demo = DemoVo.Demo.parseFrom(jedis.get(key.getBytes()));

3.4、反序列化为json字符串

//先定义JsonFormat.Printer对象
JsonFormat.Printer printer = JsonFormat.printer();
//调用print方法传入bytes[]
printer.print(DemoVo.Demo.parseFrom(jedisByte.get(key.getBytes())))

 

全部评论