Google ProtoBuf入门(Java)

ProtoBuf

google内部开源的一个序列化工具,高效、序列化后占用字节小。主要用于网络传输、RPC调用等,减少带宽流量使用,提升响应速度。

Java

根据自己使用的系统,下载需要的proto工具,proto-release

Java项目需要引入proto依赖,maven:maven-proto

下面使用的的是windows系统:

  1. 首先编写proto定义文件:(详细语法参照github和官网)
//protobuf的序列化类定义文件,需使用proto生成要序列化的类对象,win: .\protoc.exe --java_out=输出目录 proto定义文件
//语法采用3标准,默认是2
syntax = "proto3";
//生成java类的包名,生成的java类名,不写输出classname默认为文件名
option java_package = "tom.example.serialize.protobuf";
option java_outer_classname = "PersonProto";

//PersonProto的内部类 字段名等号后面的是字段属性标识,不能重复
message Person {
    //声明内部类的属性,及属性类型,属性编号:在同一个message内部是全局唯一的,不能够重复。
    string name = 1;
    //无符号整型,有符号的话sint32
    int32 age = 2;
    bool sex = 3;
    int64 birthday = 4;
    string address = 5;
    //required、optional、repeated标注存在着3中,在3.0之前,标注是必须的,但在3.0之后required、optional是可以不写的
    //repeated 代表是集合类型
    repeated Car cars = 6;
    map<string, string> other = 7;
}

message Car {
    string name = 1;
    string color = 2;
    string engine = 3;
    //车牌号,使用下划线命名,在java类中会转换为驼峰命名的
    string plate_number = 4;
    double price = 5;
}

2. 使用proto工具生成java类,命令执行

//--java_out=输出目录,后面紧接着有个空格,空格后面是proto定义文件
.\protoc.exe --java_out=. .\person.proto

3. 编写Java测试类:

package tom.example.serialize.protobuf;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * google protobuf. 需要编写.proto文件,通过protobuf工具将proto文件解析生成java类,
 * 生成的java类用于序列化传输和反序列化
 * @author ZHUFEIFEI
 */
public class ProtobufDemo {

    public static void main(String[] args) throws IOException {
        PersonProto.Car c1 = PersonProto.Car.newBuilder()
                .setColor("red")
                .setEngine("V8")
                .setName("Lamborghini")
                .setPrice(1200)
                .setPlateNumber("A0000")
                .build();
        PersonProto.Car c2 = PersonProto.Car.newBuilder()
                .setColor("Black")
                .setEngine("V12")
                .setName("Pagani")
                .setPrice(1800)
                .setPlateNumber("A9999")
                .build();

        PersonProto.Person p = PersonProto.Person.newBuilder()
                .setName("tom")
                .setAge(999)
                .setAddress("Moon")
                .setBirthday(123)
                .setSex(true)
                .addCars(c1)
                .addCars(c2)
                .putOther("favor","InterStellar Travel")
                .build();
        //如果目录不存在,需要先创建目录
        FileOutputStream fos = new FileOutputStream(new File("D:/data/proto/person"));

//        p.writeTo(fos);
        byte[] data = p.toByteArray();
        System.out.println("proto len ==> " + data.length);
        fos.write(data);

        fos.flush();
        fos.close();

        FileInputStream fis = new FileInputStream(new File("D:/data/proto/person"));

        PersonProto.Person p1 = PersonProto.Person.parseFrom(fis);
        fis.close();

        System.out.println("read person =>> " + p1);

    }

}

 

参考:

github-proto

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章