简介
Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 等多种语言的 API。
proto file
syntax = "proto2";
package com.example.demo.protobuf.proto;
option java_multiple_files = true;
// 指定Java类的包路径,如果没有指定,则使用package的值
option java_package = "com.example.demo.protobuf.proto";
// 指定Java的类名,如果没有指定,则使用proto文件名
option java_outer_classname = "AddressBookProto";
message Person {
optional string name = 1;
optional int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
optional string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
执行protoc命令
protoc --java_out=${OUTPUT_DIR} path/to/your/proto/file
protoc -I=/path/to/your/proto/file/src/main/resources/proto/ --java_out=/path/to/your/proto/generate/src/main/java/ /path/to/your/proto/file/src/main/resources/proto/addressbook.proto
测试
@Test
void contextLoads() throws InvalidProtocolBufferException {
Person person = Person.newBuilder()
.setId(1)
.setName("hua.Li")
.setEmail("123@example.com")
.addPhones(Person.PhoneNumber.newBuilder().setType(Person.PhoneType.HOME).setNumber("15639177561").build())
.build();
AddressBook addressBook = AddressBook.newBuilder()
.addPeople(person)
.build();
log.info("AddressBook={}", addressBook);
byte[] toByteArray = addressBook.toByteArray();
log.info("AddressBook byte array={}", toByteArray);
AddressBook parseFrom = AddressBook.parseFrom(toByteArray);
log.info("AddressBook parseFrom byte array={}", parseFrom);
}