Google的Protobuf入门
2018-01-15 20:07
197 查看
Google的Protobuf作为一门开源的高性能的编解码框架,在通信框架中扮演者很重要的角色,很多商业项目将其作为编解码框架。Protobuf有以下优点:
1、产品非常成熟
2、跨语言,不局限java
3、编码后消息很小,利于存储和传输
4、编码性能高
5、支持不同版本的协议前后兼容
6、支持定义可选和必选字段
本文通过Protobuf对pojo对象编解码来来学习Protobuf入门知识,从环境的搭建和编解码小案例讲解。
一、环境搭建
从https://github.com/google/protobuf/releases网址选择protoc-xxx-win32.zip下载,下载解压得protoc.exe工具,该工具主要是根据.proto文件生成代码(本人解压的路径为桌面C:\Users\zls\Desktop\bin里),在bin文件夹下新建netty和src文件夹,并且在bin文件夹下新建一个文件SubscribeReq.proto,内容为:
在bin目录下运行:
生成代码SubscribeReqProto.java,然后在eclipse中新建一个maven项目,将SubscribeReqProto.java拷贝其中,如下
注意maven引入依赖:
二、编解码开发
写个Test测试Pojo编解码:
通过Builder构建器对SubscribeReq的属性进行设置,对于集合属性,通过addA
a472
llXXX()方法将集合对象设置到对应属性中;编码时通过SubscribeReqProto.SubscribeReq实例的toByteArray()方法,解码时通过将SubscribeReqProto.SubscribeReq的静态方法parseFrom()完成解码,相对于传统的Pojo对象赋值操作复杂一些,但是代码可以通过工具生成,所以也就是编码的习惯问题吧,Protobuf功能和性能都非常强大。
整理总结自Netty权威指南 第二版
1、产品非常成熟
2、跨语言,不局限java
3、编码后消息很小,利于存储和传输
4、编码性能高
5、支持不同版本的协议前后兼容
6、支持定义可选和必选字段
本文通过Protobuf对pojo对象编解码来来学习Protobuf入门知识,从环境的搭建和编解码小案例讲解。
一、环境搭建
从https://github.com/google/protobuf/releases网址选择protoc-xxx-win32.zip下载,下载解压得protoc.exe工具,该工具主要是根据.proto文件生成代码(本人解压的路径为桌面C:\Users\zls\Desktop\bin里),在bin文件夹下新建netty和src文件夹,并且在bin文件夹下新建一个文件SubscribeReq.proto,内容为:
package netty; option java_package = "org.netty.codec.protobuf"; option java_outer_classname = "SubscribeReqProto"; message SubscribeReq{ required int32 subReqID = 1; required string userName = 2; required string productName = 3; repeated string address = 4; }其中org.netty.codec.protobuf为包路径,SubscribeReqProto为java类名
在bin目录下运行:
生成代码SubscribeReqProto.java,然后在eclipse中新建一个maven项目,将SubscribeReqProto.java拷贝其中,如下
注意maven引入依赖:
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.4.0</version> </dependency>至此,Protobuf环境搭建完毕。
二、编解码开发
写个Test测试Pojo编解码:
package org.netty.codec.protobuf.Test; import java.util.ArrayList; import java.util.List; import java.util.MissingFormatArgumentException; import org.netty.codec.protobuf.SubscribeReqProto; import org.netty.codec.protobuf.SubscribeReqProto.SubscribeReq; import org.netty.codec.protobuf.SubscribeReqProto.SubscribeReq.Builder; import com.google.protobuf.InvalidProtocolBufferException; public class TestSubscribeReqProto { private static byte[] encode(SubscribeReqProto.SubscribeReq req){ return req.toByteArray(); } private static SubscribeReqProto.SubscribeReq decode(byte[] body) throws InvalidProtocolBufferException{ return SubscribeReqProto.SubscribeReq.parseFrom(body); } private static SubscribeReqProto.SubscribeReq createSubscribeReq(){ SubscribeReqProto.SubscribeReq.Builder builder = SubscribeReqProto.SubscribeReq.newBuilder(); builder.setSubReqID(1); builder.setUserName("zls"); builder.setProductName("Netty protobuf book"); List<String> listAdd = new ArrayList<String>(); listAdd.add("HZ xihu"); listAdd.add("HZ xiaoshan"); builder.addAllAddress(listAdd); return builder.build(); } public static void main(String[] args) throws InvalidProtocolBufferException { SubscribeReqProto.SubscribeReq req = createSubscribeReq(); System.out.println("Before encode :"+ req.toString()); SubscribeReqProto.SubscribeReq req2 = decode(encode(req)); System.out.println("After decode :" + req2.toString()); System.out.println("Assert equal : "+req2.equals(req)); } }运行结果如下:
通过Builder构建器对SubscribeReq的属性进行设置,对于集合属性,通过addA
a472
llXXX()方法将集合对象设置到对应属性中;编码时通过SubscribeReqProto.SubscribeReq实例的toByteArray()方法,解码时通过将SubscribeReqProto.SubscribeReq的静态方法parseFrom()完成解码,相对于传统的Pojo对象赋值操作复杂一些,但是代码可以通过工具生成,所以也就是编码的习惯问题吧,Protobuf功能和性能都非常强大。
整理总结自Netty权威指南 第二版
相关文章推荐
- Windows环境下google protobuf入门
- Google ProtoBuf快速入门
- google ProtoBuf 简介入门
- Google Protobuf入门与使用
- ProtoBuf例子及google ProtoBuf开发者指南
- 交叉编译 google protobuf
- google protobuf 反射机制学习笔记
- google protobuf与as3的通信协议
- Google Protobuf的字段
- Google Protobuf 使用Demo
- Google protobuf
- google protobuf详解
- google ProtoBuf开发者指南
- 【Proto文件】Google开源技术 Protobuf 简介与使用
- Java数据通讯中使用Google Protobuf 序列化与反序列化
- 在Eclipse中配置google protobuf(转)
- protobuf入门教程(四):repeated限定修饰符
- google_protobuf数据类型
- 关于google protobuf编译找不到不到google\protobuf\stubs\common.h头文件的问题
- google protobuf