下载编译器
https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protobuf-java-3.19.4.tar.gz
https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-linux-x86_64.zip
https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-osx-x86_64.zip
https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protobuf-all-3.19.4.tar.gz
java 依赖
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.19.4</version>
</dependency>
实例
Person-entity.proto
syntax = "proto3"; // 标明2版本还是3版本
option java_outer_classname = "PersonEntity";
package com.chauncy;
message Person {
int32 id = 1; // 类型 字段名 = 序号,版本2中可以使用required前缀
string name = 2;
optional string email = 3;
}
// protoV2
syntax = "proto2";
option java_outer_classname = "PersonEntity";
package com.chauncy;
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
编译成java类
protoc -I=proto的输入目录 --java_out=java类输出目录 proto的输入目录包括包括proto文件
protoc -I=./ --java_out=./tmp/ person-entity.proto
protoc -I=src/main/resource/proto
--java_out=src/main/java src/main/resource/proto/protobuf.proto
测试
package com.chauncy;
import com.google.protobuf.InvalidProtocolBufferException;
/**
* @author Chauncy Jin
* Tool:
* @date 2022/3/9
*/
public class ProtoTest {
public static void main(String[] args) {
System.out.println("===== 构建一个Person模型开始 =====");
PersonEntity.Person.Builder builder = PersonEntity.Person.newBuilder();
builder.setId(1);
builder.setName("chuancy");
builder.setEmail("chauncy_jin@163.com");
PersonEntity.Person person = builder.build();
System.out.println(person.toString());
System.out.println("===== 构建Person模型结束 =====");
System.out.println("===== gps Byte 开始=====");
for (byte b : person.toByteArray()) {
System.out.print(b);
}
System.out.println("\n" + "bytes长度" + person.toByteString().size());
System.out.println("===== gps Byte 结束 =====");
System.out.println("===== 使用gps 反序列化生成对象开始 =====");
PersonEntity.Person gd = null;
try {
gd = PersonEntity.Person.parseFrom(person.toByteArray());
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
assert gd != null;
System.out.print(gd.toString());
System.out.println("===== 使用gps 反序列化生成对象结束 =====");
}
}
快速的进行json格式化
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.19.4</version>
</dependency>
package com.chauncy;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import java.util.Arrays;
/**
* @author Chauncy Jin
* Tool:
* @date 2022/3/9
*/
public class ProtoTest {
public static void main(String[] args) {
System.out.println("===== 开始构建一个Person模型 =====");
// Person 继承了GeneratedMessageV3 实现了PersonOrBuilder
PersonEntity.Person.Builder builder = PersonEntity.Person.newBuilder();
builder.setId(1);
builder.setName("chuancy");
builder.setEmail("chauncy_xxx@163.com大家好我是中国人");
// Person 继承了GeneratedMessageV3 实现了PersonOrBuilder
PersonEntity.Person person = builder.build();
System.out.println("person 对象的长度: " + person.toString().length());
System.out.println(person.toString());
System.out.println("===== 构建Person模型结束 =====");
System.out.println("===== person Byte 开始=====");
// 转 byte 数组
System.out.println(Arrays.toString(person.toByteArray()));
//for (byte b : person.toByteArray()) {
// System.out.print(b);
//}
System.out.println("\n" + "bytes长度" + person.toByteString().size());
System.out.println("===== person Byte 结束 =====");
System.out.println("===== 使用person 反序列化生成对象开始 =====");
PersonEntity.Person ps = null;
try {
ps = PersonEntity.Person.parseFrom(person.toByteArray());
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
assert ps != null;
System.out.print(ps.toString());
System.out.println("===== 使用person 反序列化生成对象结束 =====");
System.out.println("===== 使用person 转成json对象开始 =====");
String jsonFormatM = "";
try {
jsonFormatM = JsonFormat.printer().print(ps);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(jsonFormatM);
System.out.println("json数据大小:" + jsonFormatM.getBytes().length);
System.out.println("===== 使用person 转成json对象结束 =====");
}
}