Protobuf 用途很广,是一种压缩格式的序列化工具技术组件。

但是在使用过程中会遇到很多问题,比如 java的 序列类如何生成,等等。类型不存在怎么办,等等。

首先对其进行安装

官网地址:​​https://github.com/protocolbuffers/protobuf/releases​

可以下载 带有java 语言字样的 案例包 进行查看。

Google Protobuf Java  实体List 与 实体 区别_System

解压后如图所示: 

 

Google Protobuf Java  实体List 与 实体 区别_System_02

把bin文件路径加入 系统环境变量里

Google Protobuf Java  实体List 与 实体 区别_java_03

然后通过命令:  protoc --java_out=. MetaData.proto  来生成 java类

--java_out=.  后面这个. 意思是保存到当前目录 后边是 序列化文件路径。

假设我们有这样一个类

public class Person
{
string name ;
int32 id; // Unique ID number for this person.
string email;
List<PhoneNumber> phones;
}
public class PhoneNumber
{
string number;
PhoneType type;
}

enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
public class AddressBook
{
List<Person> persons;
}

主要是person类,然后,想获取它的一个列表。或者是单个类的序列化返回。

那么 其 proto 文件应该是

AddressBook.proto

syntax = "proto3";
option java_outer_classname = "AddressBookProtos";


message Person {
string name = 1;
int32 id = 2;
string email = 3;

enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}

message PhoneNumber {
string number = 1;
PhoneType type = 2;
}

repeated PhoneNumber phones = 4;

}

message AddressBook {
repeated Person people = 1;
}

 

package在Java里面代表这个文件所在的包名,在c#里面代表该文件的命名空间,message代表一个类,

message xxx {
// 字段规则:required -> 字段只能也必须出现 1 次
// 字段规则:optional -> 字段可出现 0 次或1次
// 字段规则:repeated -> 字段可出现任意多次(包括 0)
// 类型:int32、int64、sint32、sint64、string、32-bit ....
// 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字)
字段规则 类型 名称 = 字段编号;
}

然后,通过命令行生成之后,java引用即可。

代码中可以通过 

AddressBook addressBook = AddressBook.parseFrom(new FileInputStream(args[0]));
for (Person person: addressBook.getPeopleList()) {
System.out.println("Person ID: " + person.getId());
System.out.println(" Name: " + person.getName());
if (!person.getEmail().isEmpty()) {
System.out.println(" E-mail address: " + person.getEmail());
}

for (Person.PhoneNumber phoneNumber : person.getPhonesList()) {
switch (phoneNumber.getType()) {
case MOBILE:
System.out.print(" Mobile phone #: ");
break;
case HOME:
System.out.print(" Home phone #: ");
break;
case WORK:
System.out.print(" Work phone #: ");
break;
default:
System.out.println(" Unknown phone #: ");
break;
}
System.out.println(phoneNumber.getNumber());
}
}

来验证结果。