ProtoBuf
google内部开源的一个序列化工具,高效、序列化后占用字节小。主要用于网络传输、RPC调用等,减少带宽流量使用,提升响应速度。
Java
根据自己使用的系统,下载需要的proto工具,proto-release
Java项目需要引入proto依赖,maven:maven-proto
下面使用的的是windows系统:
- 首先编写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);
}
}
参考: