Mac下安装protobuf以及简单使用

1.安装java

brew install protobuf

2.查看安装版本git

➜  protobuf git:(dev) ✗ protoc --version
libprotoc 3.4.0
➜  protobuf git:(dev) ✗

3.生成Prtobuf文件数组

➜  java git:(dev) ✗ protoc --java_out=./ com/test/frame/zookeeper/protobuf/SubscribeReq.proto
➜  java git:(dev) ✗ pwd
/Users/guanguan/study/frame/zookeeper/src/main/java
➜  java git:(dev) ✗

4.若是遇到如下问题测试

➜  protobuf git:(dev) ✗ sudo protoc --java_out=./ SubscribeReq.proto                  
[libprotobuf WARNING google/protobuf/compiler/parser.cc:546] No syntax specified for the proto file: SubscribeReq.proto. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)

解决方案,将syntax ="proto2"或者syntax="proto3"放到.proto文件前面便可解决如(SubscribeReq.proto)ui

syntax = "proto2";

package com.test.frame.zookeeper.protobuf;
option java_package="com.test.frame.zookeeper.protobuf";
option java_outer_classname="SubscribeReqProto";


message SubscribeReq{
   required int32 subReqID=1;
   required string userName=2;
   required string productName=3;
   required string address=4;


}

5.pom.xml文件中增长依赖google

<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.4.0</version>
        </dependency>

6.测试编解码效果TestSubcribeReq.java编码

package com.test.frame.zookeeper.protobuf;

import com.google.protobuf.InvalidProtocolBufferException;

/**
 * TestSubscribeReqProto class
 *
 * @author guanhuifang
 * @date 2017/10/30 下午4:35
 **/
public class TestSubscribeReqProto {


    /**
     * 编码encode
     *
     * 将SubscribeReq类型的转为字节数组
     * @param req
     * @return
     */
    private static byte[] encode(SubscribeReqProto.SubscribeReq req){
        /**
         * 编码时经过调用SubscribeReqProto.SubscribeReq实例的toByteArray便可将SubscribeReq编码为byte数组
         */
        return req.toByteArray();
    }


    /**
     * 解码
     * 将字节数组转换为SubscribeReq类型
     * @param body
     * @return
     * @throws InvalidProtocolBufferException
     */
    private static SubscribeReqProto.SubscribeReq decode(byte[] body) throws InvalidProtocolBufferException {
        /**
         * 解码时经过调用SubscribeReqProto.SubscribeReq实例的静态方法parseForm将二进制byte数组解码为原始的对象
         */
        return SubscribeReqProto.SubscribeReq.parseFrom(body);
    }

    private static SubscribeReqProto.SubscribeReq createSubscribeReq(){
        /**
         * 经过静态方法newBuilder建立Builder实例,经过Builder构建器对SubscribeReq的属性进行设置
         */
        SubscribeReqProto.SubscribeReq.Builder builder= SubscribeReqProto.SubscribeReq.newBuilder();
        builder.setSubReqID(1);
        builder.setUserName("Gholly");
        builder.setProductName("hh");

        builder.setAddress("Shenzhen");
        return builder.build();

    }

    public static void main(String[] args) throws InvalidProtocolBufferException {
        SubscribeReqProto.SubscribeReq req=createSubscribeReq();
        System.out.println("encode before:"+req.toString());
        SubscribeReqProto.SubscribeReq req2= decode(encode(req));
        System.out.println("after decode:"+req.toString());
        System.out.println(req2.equals(req));

    }



}

运行结果为:code

encode before:subReqID: 1
userName: "Gholly"
productName: "hh"
address: "Shenzhen"orm

after decode:subReqID: 1
userName: "Gholly"
productName: "hh"
address: "Shenzhen"xml

true

Process finished with exit code 0

说明编解码先后数据是同样的

相关文章
相关标签/搜索