系列导航
(一)Protobuf下载和编译
(二)Protobuf在Java中的简单使用
一、编写一个.proto文件
option java_package = "com.proto";
option java_outer_classname = "PersonProto";
message Person {
required string name = 1;
required int32 age = 2;
}
注
1、这里使用的是protobuf 2版本,也就是默认版本,如果需要用到3版本,需要在头部加上 syntax = "proto3"
。
2、java_package:声明生成的java文件的包名。
3、java_outer_classname:声明生成的java文件的名称。
4、required、optional等在2版本中存在,如果是3版本则不需要写这类前缀内容。
二、生成proto对应的Java类
打开cmd,使用protoc.exe。(需要线安装protobuf)
protoc --java_out=./ person.proto
这时候,如果不出问题将会在当前目录生成一个PersonProto文件。
三、Protobuf使用
(一)和bytes的相互转换
这个可以在网络中传输,双方约定好相同的proto文件,则可以解析出数据。
public class Protobuf2Bytes {
public static void main(String[] args) {
PersonProto.Person.Builder builder = PersonProto.Person.newBuilder();
builder.setName("aa");
builder.setAge(13);
// 转换为bytes
PersonProto.Person person = builder.build();
byte[] bytes = person.toByteArray();
System.out.println(Arrays.toString(bytes));
// 转换回来后打印数据
try {
PersonProto.Person parseFrom = PersonProto.Person.parseFrom(bytes);
System.out.println(parseFrom.getName());
System.out.println(parseFrom.getAge());
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}
(一)和json的相互转换
在web的项目中可以尝试使用,但是目前来看还没有大规模的应用。
public class Protobuf2Json {
public static void main(String[] args) {
PersonProto.Person.Builder builder = PersonProto.Person.newBuilder();
builder.setName("aa");
builder.setAge(13);
PersonProto.Person person = builder.build();
// 转json
JsonFormat.Printer printer = JsonFormat.printer();
String print = "";
try {
print = printer.print(person);
System.out.println(print);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
// 转回object
PersonProto.Person.Builder newBuilder = PersonProto.Person.newBuilder();
JsonFormat.Parser parser = JsonFormat.parser();
try {
parser.merge(print, newBuilder);
System.out.println(newBuilder.build());
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}