Protobuf的生成及使用

前言

主要是Netty 会用到这个进行编解码。 故学一波

环境搭建

链接:下载相关资源点这里
提取码:yfo4

生成环境

首先下载D:\protobuf\protoc-3.11.4-win64 然后配置到环境变量中Path

在这里插入图片描述

代码环境

为了防止 代码中报红 需要加入jar包。
方便查看 安装插件 protobuf support

添加jar包
添加插件

生成步骤

1,编写.proto 文件

syntax = "proto3";// proto3 必须加此注解

option java_package = "com.company.ser.protobuf"; // 生成类的包名,注意:会在指定路径下按照该包名的定义来生成文件夹
option java_outer_classname="SubscribeReqProto"; // 生成类的类名,注意:下划线的命名会在编译的时候被自动改为驼峰命名
message SubscribeReq{
	 int32 suReqID=1;
	 string userName=2;
	 string productName=3;
	 string address=4;
} 

2,通过命令把proto转成Java文件

生成的命令,直接复制即可 cmd

cd d:\protobuf   //你的位置 
d:
protoc -I=./ --java_out=./ ./SubscribeReq.proto

-I:.proto 文件的位置。 
--java out 输出位置会以完整包名的形式出输出
./subscribeReq.proto 需要编译成java的proto文件。

如图在这里插入图片描述

使用

public class TestMainProto {
    //编码
    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("joy chen");
        builder.setProductName("netty book");
        List<String> address = new ArrayList<>();
        address.add("NanJing");
        address.add("BeiJing");
        address.add("ShenZhen");
        builder.addAllAddress(address);
        return builder.build();
    }

    public static void main(String[] args) throws IOException {
        SubscribeReqProto.SubscribeReq req=createSubscribeReq();
        System.out.println("Before encode:" + req.toString());
        SubscribeReqProto.SubscribeReq req2=decode(encode(req));
        System.out.println("After 16进:" + bytesToHexFun2(encode(req)));
        System.out.println("After decode:" + req.toString());
        System.out.println("After equal:" + req2.equals(req));
    }


    private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    public static String bytesToHexFun2(byte[] bytes) {
        char[] buf = new char[bytes.length * 2];
        int index = 0;
        for(byte b : bytes) { // 利用位运算进行转换,可以看作方法一的变种
            buf[index++] = HEX_CHAR[b >>> 4 & 0xf];
            buf[index++] = HEX_CHAR[b & 0xf];
        }

        return new String(buf);
    }

结果:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值