protobuf安装与使用

本文介绍了protobuf的安装过程,包括解决配置时遇到的问题,如缺失`tr1/tuple`头文件和`message.cc`中模板未定义的问题。接着讲解了如何定义.proto文件并使用protoc编译,生成的Java类包含Person类及其Builder。最后,文章提到了如何测试和使用这些生成的类进行序列化和反序列化的操作。
安装protobuf

从https://github.com/protocolbuffers/protobuf下载protobuf,解压、进入,执行:

./configure
make
make check
make install
安装时遇到的问题

问题一
./configure报错:./include/gtest/internal/gtest-port.h:428:10: fatal error: ‘tr1/tuple’ file not found
在这里插入图片描述
解决方法
进入解压后的protobuf2.4.1目录,输入命令【./autogen.sh】生成configure文件
然后执行./configure CPPFLAGS=-DGTEST_USE_OWN_TR1_TUPLE=1

问题二
make时报错:google/protobuf/message.cc:175:16: error: implicit instantiation of undefined template
在这里插入图片描述
解决方法
编辑目录下的文件./src/google/protobuf/message.cc,添加头文件#include <istream>
在这里插入图片描述

定义.proto文件

person.proto:

option java_package = "com.bbllbb";
option java_outer_classname = "PersonEntity";
message Person {
	required int32 id = 1;
	required string name = 2;
	optional string email = 3;
}
使用protoc编译
protoc person.proto --java_out=../java

至此,由person.proto文件得到了一个PersonEntity.java的java文件,
生成的java文件顶部有标注:// Generated by the protocol buffer compiler. DO NOT EDIT! // source: person.proto,主要关注PersonEntity内部有一个Person类,该Person类有自己的builder

使用生成的java类

测试生成的java类,模拟序列化和反序列化的过程。

public class Test {
	public static void main (String[] args) {
        //模拟将对象转成byte[],方便传输
        PersonEntity.Person.Builder builder = PersonEntity.Person.newBuilder();
        builder.setId(1);
        builder.setName("ant");
        builder.setEmail("ghb@soecode.com");
        PersonEntity.Person person = builder.build();
        System.out.println("before :"+ person.toString());

        System.out.println("===========Person Byte==========");
        for(byte b : person.toByteArray()){
            System.out.print(b);
        }
        System.out.println();
        System.out.println(person.toByteString());
        System.out.println("================================");

        //模拟接收Byte[],反序列化成Person类
        byte[] byteArray =person.toByteArray();
        PersonEntity.Person p2 = PersonEntity.Person.parseFrom(byteArray);
        System.out.println("after :" +p2.toString());
	}
}

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

参考:
https://www.cnblogs.com/meitian/p/5791042.html
https://blog.youkuaiyun.com/zhangyuehuan/article/details/51226066
https://blog.youkuaiyun.com/antgan/article/details/52103966

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值