博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
protobuf(Protocol Buffers)java初体验
阅读量:5105 次
发布时间:2019-06-13

本文共 2578 字,大约阅读时间需要 8 分钟。

        因为项目须要所以简单的研究了下protobuf。我也是參照网上的博客,所以大部分内容我也就不反复造轮子了。首先protobuf介绍点击,使用介绍点击,使用demo看。

我个人的第一个样例也是參照这个demo来的。只是当中我有遇到一些问题,所以揪出来说说,也就给自己做个笔记,方便查阅。

        主要的东西相信大家也了解了。直接步入主题了:

        1、限定修饰符介绍 required\optional\repeated,之前给定的博客已经有这个介绍了我也不多说。这里把一些小玩儿拿出来讲讲

       ①、required必须的字段,假设不赋值就会抛出 com.google.protobuf.UninitializedMessageException: Message missing required fields: ...异常

       ②、optional可选字段,没什么好说的就是可有可无咯

       ③、repeated可反复的字段能够用来表示数组,在这里我还小小的纠结了会,搞过去就好了(纠结了好一会才知道protobuf数组怎么定义)。事实上定义数组非常easyrepeated string name=字段号;然后在赋值的刚開始用数组的形式来赋值,会抛出java.lang.IndexOutOfBoundsException: Index: 0, Size: 0的异常,我在想size为0,也就是说不能这样搞呀,然后看了下源代码是com.google.protobuf.LazyStringList name_ = com.google.protobuf.LazyStringArrayList.EMPTY这种,也就是说这个玩儿就是个集合嘛。所以赋值就用集合那套来搞定好了

       2、接下来就是正式開始了,首先准备所以须要的protoc.exe和protobuf的jar包。下载点击。没什么好配置的。所以開始吧。

       ①、首先编写一个proto文件,这里我的文件是test.proto

package protobuf; option java_package = "com.test.protobuf"; option java_outer_classname = "FirstProtobuf"; message testBuf  {   required int32 ID = 1;   optional string Url = 2;   repeated string name=3;      enum PhoneType {     MOBILE = 0;     HOME = 1;     WORK = 2;   }}
定义包名什么的就没什么好说的了。

option java_outer_classname = "FirstProtobuf";定义生成类的名字

message testBuf定义一个message内部类基本的字段什么就在这里面了

required int32 ID = 1; 定义字段,每一个字段都必须有一个唯一的字段号,由于我也是初体验所以也不知道这个字段号究竟有什么用,可是不写编译就会出Missing field number的错,反复就会出Field number 1 has already been used in "protobuf.testBuf" by field "....".的错

       ②、将文件放在解压的protoc.exe同级文件夹下

       ③、就该编译了,我这里依照网上说的(protoc.exe --java_out=./test.proto)编译出现了问题Missing input file.然后查了下问题解决,,所以用protoc ./test.proto --java_out=./命令编译通过

       ④、把生成的文件拷到新建的java文件夹下,然后把jar拷贝进来build path下

       ⑤、開始測试

序列号数据(封装数据)

public static void main(String[] args) {		FirstProtobuf.testBuf.Builder builder = FirstProtobuf.testBuf.newBuilder();		builder.setID(777);		builder.setName(0, "");		List
values = new ArrayList
(); values.add("aaa"); values.add("aba"); values.add("baa"); values.add("acc"); builder.addAllName(values); FirstProtobuf.testBuf info = builder.build(); byte[] result = info.toByteArray(); System.out.println(result.toString()); TestAlone.getData(result); }
反序列化数据

public static void getData(byte[] result) {		try {			FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(result);			System.out.println(testBuf);			System.out.println(FirstProtobuf.testBuf.PhoneType.HOME);//这里使用枚举		} catch (InvalidProtocolBufferException e) {			e.printStackTrace();		}	}
好了,到这里初体验完,事实上不难的,我刚開始时一直没有理解这个protobuf究竟是干什么的,直到我把整个流程跑通了后才理解,它就是一个封装数据(二进制)协议,通过这种方式封装数据更小,效率更高

转载于:https://www.cnblogs.com/blfshiye/p/5068229.html

你可能感兴趣的文章
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
[Data Structure & Algorithm] 有向无环图的拓扑排序及关键路径
查看>>
cassandra vs mongo (1)存储引擎
查看>>
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>
遍历Map对象
查看>>
MySQL索引背后的数据结构及算法原理
查看>>
#Leetcode# 209. Minimum Size Subarray Sum
查看>>
SDN第四次作业
查看>>
DM8168 DVRRDK软件框架研究
查看>>
django迁移数据库错误
查看>>
yii 跳转页面
查看>>
洛谷 1449——后缀表达式(线性数据结构)
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
Dirichlet分布深入理解
查看>>
(转)Android之发送短信的两种方式
查看>>
python第九天课程:遇到了金角大王
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>