Google的Protobuf例子

   Google的Protobuf作为一门开源的高性能的编解码框架,在通信框架中扮演者很重要的角色,很多商业项目将其作为编解码框架。Protobuf有以下优点:

1、产品非常成熟

2、跨语言,不局限java

3、编码后消息很小,利于存储和传输

4、编码性能高

5、支持不同版本的协议前后兼容

6、支持定义可选和必选字段

 本文通过Protobuf对pojo对象编解码来来学习Protobuf入门知识,从环境的搭建和编解码小案例讲解。

一、环境搭建

从https://github.com/google/protobuf/releases网址选择protoc-xxx-win64.zip【根据系统选择32还是64】下载,下载解压得protoc.exe工具,该工具主要是根据.proto文件生成代码(本人解压的路径为桌面D:\software\protoc-2.5.0-win32里),在bin文件夹下新建netty和src文件夹,并且在netty文件夹下新建一个文件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>2.5.0</version>【版本必须与插件的版本一致】
</dependency>
至此,Protobuf环境搭建完毕。

二、编解码开发
写个Test测试Pojo编解码:

import com.google.protobuf.InvalidProtocolBufferException;

import java.util.ArrayList;
import java.util.List;

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("wcq");
        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功能和性能都非常强大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值