1.依赖
想要正常的使用生成的Java类,需要导入protobuf的依赖:protobuf-java.jar
2.protobuf Java API
以GPS信号为例,Gps.proto文件如下:
syntax = "proto2";
option java_package = "com.test.bean";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
(1)Builders
使用Protobuf生成的每一个java类中,都会包含两种内部类:Msg和Msg包含的Builder。
以上面的GPS信号为例,
AddressBookProtos.AddressBook、AddressBookProtos.Person、AddressBookProtos.Person.PhoneNumber
AddressBookProtos.AddressBook.Builder、AddressBookProtos.Person.Builder、
AddressBookProtos.Person.PhoneNumber.Builder
这两个类提供不同的API,具体来说:
Buider提供了构建类,查询类的API(set、get、has、clear等方法)
Msg提供了查询、序列化的API。
public class Main {
public static void main(String[] args) {
//使用builder构建一个Person对象
AddressBookProtos.Person john =
AddressBookProtos.Person.newBuilder()
.setId(1234)
.setName("John Doe")
.setEmail("jdoe@example.com")
.addPhones(
//内部类PhoneNumber同样使用其Builder构建,但是注意,不需要调用build()方法
AddressBookProtos.Person.PhoneNumber.newBuilder()
.setNumber("555-4321")
.setType(AddressBookProtos.Person.PhoneType.HOME))
//build()结束整个程序流,返回Person对象
.build();
System.out.println(john);
}
}
//Msg只提供了get和has方法
String email = john.getEmail();
boolean hasEmail = john.hasEmail();
//而builder提供了add/set、get、has和clear方法
AddressBookProtos.Person.Builder builder = AddressBookProtos.Person.newBuilder();
builder.setEmail("jdoe@example.com");
boolean hasEmail1 = builder.hasEmail();
String email1 = builder.getEmail();
builder.clearEmail();
序列化:
- byte[] toBytesArray():生成字节数组
- void writeTo(OutputStresam output) :序列化并写入到指定的输出流中
反序列化:
- static Person parseFrom(byte[] data):解析二进制数组,反序列化指定对象
- static Person parseFrom(InputStream input):解析输入流,反序列化指出指定对象
public class Main {
public static void main(String[] args) {
//使用builder()Msg类
AddressBookProtos.Person john =
AddressBookProtos.Person.newBuilder()
.setId(1234)
.setName("John Doe")
.setEmail("jdoe@example.com")
.addPhones(
AddressBookProtos.Person.PhoneNumber.newBuilder()
.setNumber("555-4321")
.setType(AddressBookProtos.Person.PhoneType.HOME))
.build();
try {
//序列化
byte[] bytes = john.toByteArray();
//反序列化
System.out.println(AddressBookProtos.Person.parseFrom(bytes));
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}
最后欢迎大家访问我的个人网站:1024s