|
最近在考虑如何把c++ 和java,python,go lang在内存中进行数据交换,想到了redis,所以了解下,而Protobuf是一个很好的跨语言的序列化及反序列化工具,故而用网友的此文作一个参考:
原贴:http://blog.csdn.net/eclipser1987/article/details/8534669
google protocol buffer 可以将对象序列化,而redis作为优秀的NOSQL数据库,这里我将以实例方式介绍,将C++对象序列化,并存放在redis数据库中!
google protocol buffer 的安装以及基础使用可以阅读我上一片文章.
redis的安装使用,可以查阅,这里不再描述.我使用redis的官方C client: hiredis.
protobuf 对象模型:
[cpp] view plaincopy
- package cn.vicky.model.seri;
-
- message User {
- required int32 id = 1; // 主键,唯一
- required string username = 2; // 帐号
- required string password = 3; // 密码
- optional string email = 4; // 邮箱(可选)
- repeated Person person = 5; // 账户拥有的角色(可以重复)
- }
-
- message Person {
- required int32 id = 1; // 主键,唯一
- required string name = 2; // 角色名字
-
- repeated PhoneNumber phone = 3; // 电话号码(可以重复)
- }
-
- // 枚举类型
- enum PhoneType {
- MOBILE = 0;
- HOME = 1;
- WORK = 2;
- }
-
- message PhoneNumber {
- required string number = 1;
- optional PhoneType type = 2 [default = HOME];
- }
创建工程:
在生成对应的model.pb.h model.pb.cc 更多请阅读我上一篇文章.
将hiredis.h以及依赖库引入项目中.这里以静态链接库形式 /usr/lib/libhiredis.a
编写main,cpp
[cpp] view plaincopy
/* * File: main.cpp * Author: Vicky.H * Email: eclipser@163.com */ #include #include #include "model.pb.h" #include "hiredis.h" /* * */ int main(void) { // 创建User对象 cn::vicky::model::seri::User u; u.set_id(1); u.set_username("Jack"); u.set_password("123456"); u.set_email("289997171@qq.com"); // 创建User中的一个角色 cn::vicky::model::seri::Person* _person1 = u.add_person(); _person1->set_id(1); _person1->set_name("P1"); // 创建角色中的一个电话号码:1 cn::vicky::model::seri::PhoneNumber* _phone1 = _person1->add_phone(); _phone1->set_number("+8613618074943"); _phone1->set_type(cn::vicky::model::seri::MOBILE); // 创建角色中的一个电话号码:2 cn::vicky::model::seri::PhoneNumber* _phone2 = _person1->add_phone(); _phone2->set_number("02882334717"); _phone2->set_type(cn::vicky::model::seri::WORK); // 创建User中的一个角色 cn::vicky::model::seri::Person* _person2 = u.add_person(); _person2->set_id(2); _person2->set_name("P2"); // 创建角色中的一个电话号码:1 cn::vicky::model::seri::PhoneNumber* _phone3 = _person2->add_phone(); _phone3->set_number("+8613996398667"); _phone3->set_type(cn::vicky::model::seri::MOBILE); // 创建角色中的一个电话号码:2 cn::vicky::model::seri::PhoneNumber* _phone4 = _person2->add_phone(); _phone4->set_number("02882334717"); _phone4->set_type(cn::vicky::model::seri::WORK); // 将对象以二进制保存 const int byteSize = u.ByteSize(); std::cout str); // freeReplyObject(reply); // 第二次执行:从redis数据库读取对象数据 reply = (redisReply*) redisCommand(c, "Get Jack"); std::cout |
|
|