Google Protobuf Java API详解
来源:互联网 发布:安卓软件破解 编辑:程序博客网 时间:2024/06/05 10:15
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;}
使用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(); } }}
阅读全文
0 0
- Google Protobuf Java API详解
- google protobuf---java api的链接
- google protobuf详解
- Google 的Protobuf 技术详解
- google protobuf java 简单使用
- Protobuf详解(.Java文件)
- Google API开发详解
- google protobuf
- Google ProtoBuf
- protobuf (GOOGLE)
- google protobuf
- google protobuf
- 【google protobuf】
- google protobuf
- Google protobuf
- Google protoBuf
- Google Protobuf
- Google protobuf
- 验证日期的正则表达式加入闰年的判断以及思路分析
- java调用本地浏览器打开网页
- Codeforces Round #426 (Div. 2)
- 实体类对象的三种状态
- 分布式机器学习平台比较
- Google Protobuf Java API详解
- [集成学习] bagging和boosting
- 在谷歌浏览器中安装charset.crx离线Chrome插件,修改编码用
- EXCEL数据类型
- ios 加载本地网页 css js 无法显示问题
- windows 启动停止 java进程
- 2-SAT
- Java监视器-同步基本概念
- CF510B:Fox And Two Dots(dfs)