2019独角兽企业重金招聘Python工程师标准>>>

Netty with protobuf

这是一篇关于netty和protobuf2的文章,先来介绍一下protobuf的简单使用。网上有很多基本的protobuf的介绍,这里就不在赘述了。

protobuf官网上提供了一个例子,我们就拿那个例子来改造:

proto文件描述了消息的结构,这个文件时这样的

package tutorial;option java_package = "com.example.tutorial";
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 phone = 4;
}message AddressBook {repeated Person person = 1;
}

我们现在通过protobuf提供的源代码编译器生成我们的Java代码

E:\tools2\protobuf>protoc.exe -I=E:\test-protobuf --java_out=E:\test-protobuf E:\test-protobuf\addressbook.proto

-I表示指定proto文件的目录位置,--java-out表示输出Java源代码的目录位置,后跟的参数表示文件的路径

现在在你所指定的目录下有一个Java类文件,就是AddressBookProtos.java文件。

通过这个类可以把这个类序列化,看示例代码:

@Test
public void test() throws IOException {AddressBookProtos.AddressBook.Builder addressBookBuilder = AddressBookProtos.AddressBook.newBuilder();AddressBookProtos.Person.PhoneNumber.Builder phoneNumberBuilder = AddressBookProtos.Person.PhoneNumber.newBuilder();AddressBookProtos.Person.Builder personBuilder = AddressBookProtos.Person.newBuilder();personBuilder.setEmail("744858873@qq.com").setId(123456789).setName("hellolyx");personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330465").setType(AddressBookProtos.Person.PhoneType.HOME).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330466").setType(AddressBookProtos.Person.PhoneType.WORK).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330467").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330468").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330469").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.setPhone(0, phoneNumberBuilder.setNumber("110").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());//向电话薄里添加一个联系人addressBookBuilder.addPerson(personBuilder.build());personBuilder.setEmail("78655676@qq.com").setId(123456789).setName("hellodog");personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330465").setType(AddressBookProtos.Person.PhoneType.HOME).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330466").setType(AddressBookProtos.Person.PhoneType.WORK).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330467").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330468").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330469").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.setPhone(0, phoneNumberBuilder.setNumber("119").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());//再次向电话薄里添加一个联系人addressBookBuilder.addPerson(personBuilder.build());personBuilder.setEmail("78655676@qq.com").setId(123456789).setName("hellopig");personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330465").setType(AddressBookProtos.Person.PhoneType.HOME).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330466").setType(AddressBookProtos.Person.PhoneType.WORK).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330467").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330468").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330469").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.setPhone(0, phoneNumberBuilder.setNumber("124").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());addressBookBuilder.addPerson(personBuilder.build());/*** 一个电话薄里添加了三个人*/byte[] book = addressBookBuilder.build().toByteArray();String path = "E:\\test-protobuf\\test.txt";FileOutputStream fileOutputStream = new FileOutputStream(path);fileOutputStream.write(book);fileOutputStream.close();//反序列化AddressBookProtos.AddressBook b = AddressBookProtos.AddressBook.parseFrom(book);System.out.println(b.toString());
}

这是通过proto.exe生成的Java类的基本用法,最后打印出来的信息略。

通过这种方式,你可以发现序列化一个类是不是很方便啊,并且序列化和反序列有很好的性能,同时序列后的数据量很小。

在上个例子中,我们吧序列化后的数据保存在了txt文件中,现在可以通过读取这个文本文件反序列化。

/*** 在运行时确定消息格式,动态生成消息*/
@Test
public void test8876() throws IOException {String messagePath = "E:\\test-protobuf\\test.txt";FileInputStream fileInputStream = new FileInputStream(messagePath);byte[] message = new byte[fileInputStream.available()];fileInputStream.read(message);Descriptors.FileDescriptor fileDescriptor = AddressBookProtos.getDescriptor();Descriptors.Descriptor addressBookDescriptor = fileDescriptor.findMessageTypeByName("AddressBook");DynamicMessage addressBook = DynamicMessage.parseFrom(addressBookDescriptor, message);System.out.println(addressBook.toString());
}

这就是基本的protobuf-java类库的基本使用方法。对于protobuf的自描述消息还没有研究的很透彻,等研究明白了,再把那个发上来。

====END====

转载于:https://my.oschina.net/xinxingegeya/blog/295031

Netty with protobuf(一)相关推荐

  1. netty 对 protobuf 协议的解码与包装探究(2)

    netty 默认支持protobuf 的封装与解码,如果通信双方都使用netty则没有什么障碍,但如果客户端是其它语言(C#)则需要自己仿写与netty一致的方式(解码+封装),提前是必须很了解net ...

  2. Spring Boot 整合 Netty和Protobuf

    前言 本篇文章主要介绍的是SpringBoot整合Netty以及使用Protobuf进行数据传输的相关内容.Protobuf会简单的介绍下用法. 介绍 protocol buffer(以下简称PB)是 ...

  3. netty 基于 protobuf 协议 实现 websocket 版本的简易客服系统

    https://segmentfault.com/a/1190000017464313 netty 基于 protobuf 协议 实现 websocket 版本的简易客服系统 结构 netty 作为服 ...

  4. Netty with protobuf(二)

    2019独角兽企业重金招聘Python工程师标准>>> http://my.oschina.net/xinxingegeya/blog/295031 上一篇了解了protobuf,现 ...

  5. Netty使用protobuf进行消息编解码代码示例

    客户端handler: package cn.zhangxueliang.netty.codec;import io.netty.buffer.ByteBuf; import io.netty.buf ...

  6. 开源一个自用的Android IM库,基于Netty+TCP+Protobuf实现。

    欢迎转载,转载请注明出处:https://blog.csdn.net/FreddyChen/article/details/89201785 写在前面 一直想写一篇关于im即时通讯分享的文章,无奈工作 ...

  7. Netty的深入浅出--10.接上一篇netty与protobuf整合的问题

    上一章的问题:在处理器中new ProtobufDecoder()这个解码已经写死了,所以很难再进行一个其他参数类型的解码,也就是说,如果我在.proto 的配置文件中再加一个message pers ...

  8. netty系列之:在netty中使用protobuf协议

    文章目录 简介 定义protobuf 定义handler 设置ChannelPipeline 构建client和server端并运行 总结 简介 netty中有很多适配不同协议的编码工具,对于流行的g ...

  9. SuperSocket与Netty之实现protobuf协议,包括服务端和客户端

    今天准备给大家介绍一个c#服务器框架(SuperSocket)和一个c#客户端框架(SuperSocket.ClientEngine).这两个框架的作者是园区里面的江大渔. 首先感谢他的无私开源贡献. ...

最新文章

  1. 爱情是一出未经排练的戏
  2. 300张小抄表搞定机器学习知识点:学习根本停不下来!
  3. html 无序列表编程一排_HTML 入门笔记
  4. php 删除相对应的id,PHP 在下面这个留言板代码中加入删除按钮,每一个删除按钮删除相对应一行数据,这怎么弄...
  5. Java轻量级业务层框架Spring两大核心IOC和AOP原理
  6. angular 关闭当前页_angular刷新当前页 angularjs页面不刷新的解决办法 - 电脑常识 - 服务器之家...
  7. 计算机系统-CPU优化/特权级
  8. LaTeX学习笔记(legacy)~
  9. 计算机四级知识试卷答案,计算机四级考试试题及答案
  10. python笔记26-命令行传参sys.argv实际运用
  11. Tip: JSP开发模式
  12. Poj(1274),二分图匹配
  13. html注册登录模板
  14. TCP,IP,UDP等各种报文格式
  15. 用游戏编辑器制作MOD脱颖而出
  16. 辽宁大连IPv6高校
  17. 音乐学院计算机音乐实验中心,中央音乐学院鼎石实验学校
  18. Mac mini7.1 2014年末 安装单windows 10系统
  19. vue 使用three.js 实现3D渲染
  20. 使用图生成多任务模型缩小基于靶标和基于细胞的药物发现之间的差异

热门文章

  1. php如何打开数据库,php数据库怎么打开
  2. (上)挖掘传统行业日志大数据的无限价值
  3. 利用Linux系统生成随机密码的10种方法
  4. 覃超:从湘西到Facebook,硅谷只是技术人生的一小站
  5. MathType可以在Word、PPT中插入矩阵吗
  6. [翻译] 聚集索引表 VS 堆表
  7. React-Amap-HOC组件封装
  8. Configured broker.id 2 doesn‘t match stored broker.id 3 in meta.properties
  9. flink的DAG可视化使用(visualizer的使用)
  10. hbase异步客户端连接-非阻塞并发模式实验记录(还没弄完)