前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Protobuf入门

Protobuf入门

作者头像
阿泽
发布2019-10-16 13:46:19
7220
发布2019-10-16 13:46:19
举报

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,内容为:

代码语言:javascript
复制
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目录下运行:

代码语言:javascript
复制
protoc --java_out=.\src .\netty\SubscribeReq.proto

生成代码SubscribeReqProto.java,然后在eclipse中新建一个maven项目,将SubscribeReqProto.java拷贝其中,如下

注意maven引入依赖:

代码语言:javascript
复制
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
    <version>3.6.1</version>
</dependency>

至此,Protobuf环境搭建完毕。

二、编解码开发

写个Test测试Pojo编解码:

代码语言:javascript
复制
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的属性进行设置,对于集合属性,通过addAllXXX()方法将集合对象设置到对应属性中;编码时通过SubscribeReqProto.SubscribeReq实例的toByteArray()方法,解码时通过将SubscribeReqProto.SubscribeReq的静态方法parseFrom()完成解码,相对于传统的Pojo对象赋值操作复杂一些,但是代码可以通过工具生成,所以也就是编码的习惯问题吧,Protobuf功能和性能都非常强大。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Flink实战应用指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档