Google Protobuf Java 实体List 与 实体 区别
原创
©著作权归作者所有:来自51CTO博客作者蓝创精英团队的原创作品,请联系作者获取转载授权,否则将追究法律责任
Protobuf 用途很广,是一种压缩格式的序列化工具技术组件。
但是在使用过程中会遇到很多问题,比如 java的 序列类如何生成,等等。类型不存在怎么办,等等。
首先对其进行安装
官网地址:https://github.com/protocolbuffers/protobuf/releases
可以下载 带有java 语言字样的 案例包 进行查看。
解压后如图所示:
把bin文件路径加入 系统环境变量里
然后通过命令: 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());
}
}
来验证结果。