Protocol Buffer 学习笔记

在使用Protocol Buffers 3.2.0版本时遇到了编译问题,主要表现为在CentOS 6.5上编译时的错误,涉及`InternalMetadataWithArenaBase`。解决方案是修改构造函数。另外,examples编译失败是因为缺少protobuf的pkg-config路径,通过设置`PKG_CONFIG_PATH`可以解决。文章还探讨了Protocol Buffers的向前和向后兼容性概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天准备用Protobuf做一些序列化,在这个过程中发现了一些问题

下载的版本是 3.2.0 https://github.com/google/protobuf/releases/download/v3.2.0/protobuf-cpp-3.2.0.tar.gz 

编译错误

下载之后按照说明开始按照,在编译的时候发现编译不过,环境是centos 6.5,错误如下

In file included from ./google/protobuf/any.pb.h:25,
from google/protobuf/any.pb.cc:5:
./google/protobuf/metadata.h: In constructor ‘google::protobuf::internal::InternalMetadataWithArena::InternalMetadataWithArena(google::protobuf::Arena*)’:
./google/protobuf/metadata.h:175: error: class ‘google::protobuf::internal::InternalMetadataWithArena’ does not have any field named ‘InternalMetadataWithArenaBase’
./google/protobuf/metadata.h: In constructor ‘google::protobuf::internal::InternalMetadataWithArenaLite::InternalMetadataWithArenaLite(google::protobuf::Arena*)’:
./google/protobuf/metadata.h:204: error: class ‘google::protobuf::internal::InternalMetadataWithArenaLite’ does not have any field named ‘InternalMetadataWithArenaBase’
make[2]: *** [google/protobuf/any.pb.lo] Error 1
make[2]: Leaving directory /home/protobuf/src' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory/home/protobuf'
make: *** [all] Error 2

查了一下google发现是一个bug,在#2559已经修复,https://github.com/google/protobuf/pull/2599/commits/141a1dac6ca572056c6a8b989e41f6ee213f8445

就是改了构造函数,将 InternalMetadataWithArenaBase(arena) {} 改成了 InternalMetadataWithArenaBase<UnknownFieldSet, InternalMetadataWithArena>(arena) {},两个地方175行和204行改一下就好了

examples编译出错

examples]$ make cpp
protoc --cpp_out=. --java_out=. --python_out=. addressbook.proto
pkg-config --cflags protobuf  # fails if protobuf is not installed
Package protobuf was not found in the pkg-config search path.
Perhaps you should add the directory containing `protobuf.pc'
to the PKG_CONFIG_PATH environment variable
No package 'protobuf' found
make: *** [add_person_cpp] 错误 1

解决方法 

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/

向前兼容和向后兼容

message Req
{
  required int32 msgid = 1;
  required string buf = 2;
  required int32  len = 3
}

        有A和B两个模块,他们之间通过消息进行通信,比如我们有以上消息Req(A ----> B),刚开始有三个字段,后来增加了一个新的字段 消息类型。我们把增加了 消息类型 的版本成为 成为“新版”;之前的叫“老版”。

  所谓的“向后兼容”(backward compatible),也称作向下兼容,就是说,当模块B升级了之后,它能够正确识别模块A发出的老版的协议。由于老版没有“消息类型”,我们可以把“消息类型”属性设置成optional,或者设置一个缺省值。
  所谓的“向前兼容”(forward compatible),也称作向上兼容,就是说,当模块A升级了之后,模块B能够正常识别模块A发出的新版的协议。这时候,新增加的“消息类型”会被忽略。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值