因为项目须要所以简单的研究了下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初体验相关推荐

  1. 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是一 ...

  2. Protocol Buffers java

    Protocol Buffers https://developers.google.cn/protocol-buffers/ 一. 例 addressbook.proto.syntax = &quo ...

  3. 谷歌protobuf(Protocol buffers)的使用

    谷歌protobuf的使用 一.概述 二.安装 三.protobuf中的限定符 四.protobuf支持的数据类型 五.编译 1. 将proto文件编译成 C++ 文件 2. 将编译好的文件与代码一起 ...

  4. 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 ...

  5. Java入门 - Java初体验

    第1关:Java第一课 任务描述 本关任务:编写你的第一个Java程序,效果图如下: 编写第一个Java程序 1.新建一个HelloWorld.java文件(新建HelloWorld.txt将后缀.t ...

  6. 头歌Java实训答案——Java初体验

    第1关:Java第一课 public class HelloWorld{/********* Begin *********/public static void main(String[] args ...

  7. 头歌--Java入门 - Java初体验

    目录 第1关:Java第一课 任务描述 编程要求 测试说明 第2关:JAVA入门测试题

  8. 头歌实践教学平台:Java入门 - Java初体验

    第1关:Java第一课 public class HelloWorld{ /********* Begin *********/ public static void main (String[] a ...

  9. 史上最细gRPC(Go)入门教程(二)---gRPC初体验--hello world

    来自:指月小筑 https://lixueduan.com 原文:https://lixueduan.com/post/grpc/02-hello-world/ 本文主要对 gRPC 框架做了简单的介 ...

  10. Google Protocol Buffers 2.3.0 for java 快速开始

    Google Protocol Buffers 2.3.0 for java 快速开始 博客分类: Java JavaGoogleUbuntuLinux数据结构 Protocol Buffers是一个 ...

最新文章

  1. Redis源码解析——字典遍历
  2. BEA WebLogic平台下J2EE调优攻略--转载
  3. 在2019年比较云计算服务时需要问的6个问题
  4. GCC编译过程以及对应FILE文件表
  5. Jam's balance HDU - 5616 (01背包基础题)
  6. c++ string 删除字符_字符串操作的全面总结(附完整代码)
  7. leetcode1328. 破坏回文串
  8. 85后博士不到一年发10篇顶刊!共发SCI50多篇
  9. 使用POI读取word文档
  10. Windows中Git无法显示中文
  11. windows bat脚本编写_怎样在 txt 中用 2 行代码写出一个锁屏休息提醒脚本?
  12. String转LocalDateTime
  13. 人工智能入坑-机器学习-小目标
  14. 测试后台管理系统思路和方法
  15. 关于FTTx(Fiber To The X:光纤接入)
  16. gitlab备份库局域网中远程备份至另一台windows电脑
  17. implement在java中怎么用_JAVA中implement和extends的区别
  18. 乱码文件删除不了的解决方法(需要everyone权限)
  19. 【跨境电商平台】Magento VS Shopify,选谁进行独立站建站?
  20. Android之获取手机基本信息、内存信息、网路信息、电池信息,等一共18项数据

热门文章

  1. 基于OpenCV的红绿灯识别代码解析
  2. 无约束最优化(二) 共轭方向法与共轭梯度法
  3. 题解 P2163 SHOI2007 园丁的烦恼
  4. [转]vc6如何设置Unicode字符集
  5. UnicodeMath编码教程
  6. 项目: 基于Python socket模块实现的简单 ftp 项目:
  7. Xcode 8 Swift 类似插件方法
  8. 【bzoj 2541】 [Ctsc2000]冰原探险(BFS)
  9. c#设计模式之简单工厂
  10. 团队个人每天详细计划汇总