protobuf 3
Protobuf3是类似json,xml的数据交换协议,但是传输的数据更小,传输的速度更快; 跨语言交互,支持大部分主流编程语言。protobuf是一种数据交换的格式,以二进制的格式进行数据交换,
主要用于网络传输、配置文件、数据存储等诸多领域。
idea中编译protobuf
首先,下载安装Protobuf Support插件
其次,添加依赖
<properties> <protobuf.version>3.7.1</protobuf.version> <grpc.version>1.22.0</grpc.version> </properties> <dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>${protobuf.version}</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java-util</artifactId> <version>${protobuf.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-all</artifactId> <version>${grpc.version}</version> </dependency> </dependencies>
Message
Protobuf3通过proto文件定义交互的对象,student.proto如下:
syntax = "proto3";
option java_package = "com.smile.entity";
option java_outer_classname = "StudentProtoBuf";
message student {
int32 id = 1; //指定字段类型为 int32,标识号为 1
string name = 2;
string email = 3;
enum Sex {
MAN = 0;
WOMAN = 1;
}
Sex sex = 4;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
//内部类
message PhoneNumber {
string number = 1;
PhoneType phoneType = 2;
}
repeated PhoneNumber phoneNumber = 5;
}
使用插件将proto文件转换为java文件

测试类
public class ProtoBufTest { public static void main(String[] args) { StudentProtoBuf.student.Builder studentBuilder = StudentProtoBuf.student.newBuilder(); studentBuilder.setId(10001); studentBuilder.setName("美国队长"); studentBuilder.setEmail("123@qq.com"); studentBuilder.setSex(StudentProtoBuf.student.Sex.MAN); StudentProtoBuf.student.PhoneNumber.Builder mobilePhone = StudentProtoBuf.student.PhoneNumber.newBuilder(); mobilePhone.setNumber("123456"); mobilePhone.setPhoneType(StudentProtoBuf.student.PhoneType.MOBILE); studentBuilder.addPhoneNumber(mobilePhone.build()); StudentProtoBuf.student.PhoneNumber.Builder homePhone = StudentProtoBuf.student.PhoneNumber.newBuilder() .setNumber("10001-22222") .setPhoneType(StudentProtoBuf.student.PhoneType.HOME); studentBuilder.addPhoneNumber(homePhone.build()); //序列化 StudentProtoBuf.student student = studentBuilder.build(); System.out.println("protobuf数据的大小:" + student.toByteString().size()); //再将封装有数据的对象实例,转换为字节数组,用于数据传输、存储等 byte[] stuBytes = student.toByteArray(); //反序列化 StudentProtoBuf.student student1 = null; try { student1 = StudentProtoBuf.student.parseFrom(stuBytes); System.out.println("学生的Id号:" + student1.getId()); System.out.println("学生的姓名:" + student1.getName()); System.out.println("学生的邮箱:" + student1.getEmail()); System.out.println("学生的性别:" + (student1.getSex().getNumber() == 0 ? "男" : "女")); List<StudentProtoBuf.student.PhoneNumber> phoneNumberList = student1.getPhoneNumberList(); for (StudentProtoBuf.student.PhoneNumber phoneNumber : phoneNumberList) { System.out.println(phoneNumber.getPhoneType() + " " + phoneNumber.getNumber()); } } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } //快速json序列化 String jsonObject = ""; try { jsonObject = JsonFormat.printer().print(student); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } System.out.println("json数据:" + jsonObject.toString()); System.out.println("json数据大小:" + jsonObject.getBytes().length); } }
Map对象:key,value都可以是复杂对象
message ComplexObject { map<string, MapVaule> map = 8; // 定义Map对象 } // 定义Map的value值 message MapVaule { string mapValue = 1; }
// 对应proto里:map<string, MapVaule> map_field = 8; MapVaule.Builder mapValue = MapVaule.newBuilder(); mapValue.setMapValue("mapValue"); builder.putMap("mapKey", mapValue.build());
立志如山 静心求实
浙公网安备 33010602011771号