protobuf(Protocol Buffers)java初体验
因为项目须要所以简单的研究了下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<String> values = new ArrayList<String>();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
protobuf(Protocol Buffers)java初体验相关推荐
- ganymed ssh-2 for java,SSH客户端开发开源组件Ganymed SSH-2 for Java初体验,ganymedssh-2
SSH客户端开发开源组件Ganymed SSH-2 for Java初体验,ganymedssh-2 1.Ganymed SSH-2 for Java Ganymed SSH-2 for Java是一 ...
- Protocol Buffers java
Protocol Buffers https://developers.google.cn/protocol-buffers/ 一. 例 addressbook.proto.syntax = &quo ...
- 谷歌protobuf(Protocol buffers)的使用
谷歌protobuf的使用 一.概述 二.安装 三.protobuf中的限定符 四.protobuf支持的数据类型 五.编译 1. 将proto文件编译成 C++ 文件 2. 将编译好的文件与代码一起 ...
- SSH客户端开发开源组件Ganymed SSH-2 for Java初体验
1.Ganymed SSH-2 for Java Ganymed SSH-2 for Java是一个纯Java实现的SHH2库. 看官方介绍: Ganymed SSH-2 for Java is a ...
- Java入门 - Java初体验
第1关:Java第一课 任务描述 本关任务:编写你的第一个Java程序,效果图如下: 编写第一个Java程序 1.新建一个HelloWorld.java文件(新建HelloWorld.txt将后缀.t ...
- 头歌Java实训答案——Java初体验
第1关:Java第一课 public class HelloWorld{/********* Begin *********/public static void main(String[] args ...
- 头歌--Java入门 - Java初体验
目录 第1关:Java第一课 任务描述 编程要求 测试说明 第2关:JAVA入门测试题
- 头歌实践教学平台:Java入门 - Java初体验
第1关:Java第一课 public class HelloWorld{ /********* Begin *********/ public static void main (String[] a ...
- 史上最细gRPC(Go)入门教程(二)---gRPC初体验--hello world
来自:指月小筑 https://lixueduan.com 原文:https://lixueduan.com/post/grpc/02-hello-world/ 本文主要对 gRPC 框架做了简单的介 ...
- Google Protocol Buffers 2.3.0 for java 快速开始
Google Protocol Buffers 2.3.0 for java 快速开始 博客分类: Java JavaGoogleUbuntuLinux数据结构 Protocol Buffers是一个 ...
最新文章
- Redis源码解析——字典遍历
- BEA WebLogic平台下J2EE调优攻略--转载
- 在2019年比较云计算服务时需要问的6个问题
- GCC编译过程以及对应FILE文件表
- Jam's balance HDU - 5616 (01背包基础题)
- c++ string 删除字符_字符串操作的全面总结(附完整代码)
- leetcode1328. 破坏回文串
- 85后博士不到一年发10篇顶刊!共发SCI50多篇
- 使用POI读取word文档
- Windows中Git无法显示中文
- windows bat脚本编写_怎样在 txt 中用 2 行代码写出一个锁屏休息提醒脚本?
- String转LocalDateTime
- 人工智能入坑-机器学习-小目标
- 测试后台管理系统思路和方法
- 关于FTTx(Fiber To The X:光纤接入)
- gitlab备份库局域网中远程备份至另一台windows电脑
- implement在java中怎么用_JAVA中implement和extends的区别
- 乱码文件删除不了的解决方法(需要everyone权限)
- 【跨境电商平台】Magento VS Shopify,选谁进行独立站建站?
- Android之获取手机基本信息、内存信息、网路信息、电池信息,等一共18项数据