protobuf 3.5 java使用介绍(二)
protobuf 3.5 java使用介绍(二)
上一篇遗留了两个问题:
- 1,数据模型中有可能会出现数组格式,而数组里面是一个其他的模型,这个怎么来做?
- 2,构建数据消息的时候,通常会有一个头,一个体;根据头中定义的数据类型不同,体里面的数据模型也不相同,这个又该怎么处理?
模型数组
假如我们需要一个"路径"的模型,路径由很多个"点"组成,同时在路径中还有一些其它的属性信息,其中类型为定义好的几个值。
1,首先,定义一个"pint":
syntax = "proto3";package iot.adsb.vip;message point{double lon = 2; //经度double lat = 3; //纬度
}
2,然后,定义"path"
syntax = "proto3";import "point.proto";package iot.adsb.vip;message path
{enum typeEnum {COMMUTE = 0; //通勤DUTY = 1; //工作}string id = 1; string name = 2; //名称typeEnum type = 3; //类型repeated point geometry = 4; //点集合
}
好了,这样两个protobuf的文件就满足了我们的要求,生成一下代码看看。
3,进入proto文件所在的文件夹,执行
protoc --java_out=. *.proto
然后可以在当前文件夹下看到生成好的java代码
4,下面,我们来使用一下生成好的模型测试一下
Point.point.Builder point_builder1 = Point.point.newBuilder();point_builder1.setLat(101.11);point_builder1.setLon(39.11);Point.point point1 = point_builder1.build();System.out.println(point1.toString());System.out.println("===== 构建point1模型结束 =====");Point.point.Builder point_builder2 = Point.point.newBuilder();point_builder2.setLat(101.11);point_builder2.setLon(39.11);Point.point point2 = point_builder2.build();System.out.println(point1.toString());System.out.println("===== 构建point2模型结束 =====");Path.path.Builder pathBuilder = Path.path.newBuilder();pathBuilder.setId("1");pathBuilder.setName("路径");pathBuilder.setType(Path.path.typeEnum.DUTY);pathBuilder.addGeometry(0, point1);pathBuilder.addGeometry(1, point2);Path.path path = pathBuilder.build();System.out.println(path.toString());System.out.println("===== 构建path模型结束 =====");System.out.println("===== 转成json对象开始 =====");String jsonFormatM = "";try {jsonFormatM = JsonFormat.printer().print(path);} catch (Exception e) {e.printStackTrace();}System.out.println(jsonFormatM.toString());System.out.println("json数据大小:" + jsonFormatM.getBytes().length);System.out.println("===== 转成json对象结束 =====");
结果如下:
Connected to the target VM, address: '127.0.0.1:52895', transport: 'socket'
lon: 39.11
lat: 101.11===== 构建point1模型结束 =====
lon: 39.11
lat: 101.11===== 构建point2模型结束 =====
id: "1"
name: "\350\267\257\345\276\204"
type: DUTY
geometry {lon: 39.11lat: 101.11
}
geometry {lon: 39.11lat: 101.11
}===== 构建path模型结束 =====
===== 转成json对象开始 =====
{"id": "1","name": "路径","type": "DUTY","geometry": [{"lon": 39.11,"lat": 101.11}, {"lon": 39.11,"lat": 101.11}]
}
json数据大小:155
===== 转成json对象结束 =====
Disconnected from the target VM, address: '127.0.0.1:52895', transport: 'socket'Process finished with exit code 0
消息头/体结构
通常在做实际项目的时候,消息是需要用信封做一下封装便于业务的处理和一些业务无关的信息(例如:ID,加密信息等)存放。消息体根据消息类型是不同的数据类型。
实现这个的方式其实很简单,protobuf对象可以序列化成byte数组,然后,在信封的模型里定义一个 bytes 类型的字段用于存放消息体即可。
1,如下定义消息信封:
syntax = "proto3";import "point.proto";package iot.adsb.vip;message msg
{string mid = 1;string type = 2;bytes data = 3; //数据内容
}
2,按照上面的方法,生成JAVA模型
3,测试一下
public static void main(String[] args) {// 消息体为 PointPoint.point.Builder point_builder1 = Point.point.newBuilder();point_builder1.setLat(101.11);point_builder1.setLon(39.11);Point.point point1 = point_builder1.build();System.out.println(point1.toString());System.out.println("===== 构建point1模型结束 =====");// 构建消息Msg.msg.Builder msgBuilder = Msg.msg.newBuilder();msgBuilder.setMid("1");msgBuilder.setType("PATH");msgBuilder.setData(point1.toByteString());Msg.msg msg = msgBuilder.build();System.out.println(msg.toString());System.out.println("===== 构建msg模型结束 =====");byte[] msgBytes = msg.toByteArray();// 解析消息try {Msg.msg msgParse = Msg.msg.parseFrom(msgBytes);System.out.println(msgParse.toString());System.out.println("===== 反序列化msg模型结束 =====");System.out.println("PATH取值");System.out.println(msgParse.getMid());System.out.println(msgParse.getType());switch (msgParse.getType()) {case "PATH":System.out.println("PATH消息");Point.point pointParse = Point.point.parseFrom(msgParse.getData());System.out.println(pointParse.toString());System.out.println("===== 反序列化point模型结束 =====");System.out.println("Point取值");System.out.println("纬度:" + pointParse.getLat());System.out.println("经度:" + pointParse.getLon());break;case "":break;}} catch (InvalidProtocolBufferException ex) {System.out.println(ex);}}
测试结果
Connected to the target VM, address: '127.0.0.1:49427', transport: 'socket'
lon: 39.11
lat: 101.11===== 构建point1模型结束 =====
mid: "1"
type: "PATH"
data: "\021\256G\341z\024\216C@\031\327\243p=\nGY@"===== 构建msg模型结束 =====
mid: "1"
type: "PATH"
data: "\021\256G\341z\024\216C@\031\327\243p=\nGY@"===== 反序列化msg模型结束 =====
PATH取值
1
PATH
PATH消息
lon: 39.11
lat: 101.11===== 反序列化point模型结束 =====
Point取值
纬度:101.11
经度:39.11
Disconnected from the target VM, address: '127.0.0.1:49427', transport: 'socket'Process finished with exit code 0
代码下载地址
上一篇
protobuf 3.5 java使用介绍(二)相关推荐
- GoldenGate for Java adapter介绍二(代码篇)
本示例主要介绍通过实现OGG的接口函数,实现自定义处理增量数据,将数据实时写入到mariadb (OGG官方不支持此数据库,所以只能采用自定义方式实现).以下是本次示例的4个类: Connection ...
- java自我介绍_口语化java自我介绍
口语化java自我介绍 自我介绍是对个人特点的总结与归纳.一个好的自我介绍可以让HR很快地了解自己,欣赏自己.下面小编为大家整理了口语化java自我介绍,希望大家喜欢. 口语化java自我介绍(一) ...
- Java数组介绍(一维数组和二维数组)
Java数组介绍(一维数组和二维数组) 1. 概述 · 数组是存储多个变量的容器. · 存储的多个变量必须是同一种数据类型. · 数组既可以存储基本数据类型,也可以存储引用数据类型. 2. 数组定义的 ...
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
原 java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 2012年08月29日 23:44:10 Kilnn 阅读数:56717 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- Java命令学习系列(零)——常见命令及Java Dump介绍
Java命令学习系列(零)--常见命令及Java Dump介绍 一.常用命令: 在JDK的bin目彔下,包含了java命令及其他实用工具. jps:查看本机的Java中进程信息. jstack ...
- 【转】java提高篇(二)-----理解java的三大特性之继承
[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...
- js 中转换成list集合_程序员:java集合介绍-List,具说很详细,你不来看看?
Java集合介绍 作为一个程序猿,Java集合类可以说是我们在工作中运用最多.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加方便开发. Java集合就像一个容器,可以存储任何类型的数 ...
- 基于java项目ssm二手书交易平台设计与实现(论文+程序设计源码+数据库文件)
1 绪论 4 1.1 项目开发背景 4 1.2 项目开发意义 5 1.3 项目主要的内容 5 2 相关技术介绍及系统环境开发条件 6 2.1相关技术介绍 6 2.2系统环境开发条件 7 3 系统的需求 ...
- Java爬虫(二)-- httpClient模拟Http请求+jsoup页面解析
博客 学院 下载 GitChat TinyMind 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye 写博客 发Chat 传资源 登录注册 原 Java爬虫(二)-- httpClient ...
最新文章
- 阅读Book: MultiObjective using Evolutionary Algorithms (5) ---- Non-Dominated Sorting of a Population
- HK二分图最大匹配算法模板
- Eclipse保存文件时出现字符编码错误
- 通用数组(练习,可能有错)
- linux命令 sed 有的功能有,Linux命令:sed简介
- 台式机也颤抖!ROG Strix S5AS性能强悍到底
- 津津的储蓄计划(信息学奥赛一本通-T1074)
- 网络爬虫数据挖掘_我如何构建无服务器网络爬虫以大规模挖掘温哥华房地产数据...
- linux中部分命令及快捷键
- qiankun 传统项目配置_微前端 qiankun 项目实践
- LeetCode:递归思想的延伸,从斐波那契数列到爬楼梯模型
- 探索软件模式设计(一)
- springboot 对象 空指针_springboot获取getBean方法以及ApplicationContext空指针问题解决...
- 电脑照片抠图软件哪个好?来看看这两个简单好用的工具
- 网件R6220路由器刷机失败 路由器变砖恢复
- gaster字体转换器_gaster语言翻译器
- php 代码加密运行,php加密后可以直接运行吗
- 数据可视化Matplotlib库
- 华为鸿蒙系统2.0是什么?Android的升级版?
- 计算机辅助设计在环境工程中的应用,试论计算机辅助设计在环境工程中的应用原稿(全文完整版)...