google protocol buffer 与 redis 结合使用
google protocol buffer 可以将对象序列化,而redis作为优秀的NOSQL数据库,这里我将以实例方式介绍,将C++对象序列化,并存放在redis数据库中!google protocol buffer 的安装以及基础使用可以阅读我上一片文章.redis的安装使用,可以查阅,这里不再描述.我使用redis的官方C client: hiredis.protobuf 对象模型:[cpp]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]/** File: main.cpp* Author: Vicky.H* Email: eclipser@163.com*/#include <iostream>#include <fstream>#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");// 创建角色中的一个电话号码:1cn::vicky::model::seri::PhoneNumber* _phone1 = _person1->add_phone();_phone1->set_number("+8613618074943");_phone1->set_type(cn::vicky::model::seri::MOBILE);// 创建角色中的一个电话号码:2cn::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");// 创建角色中的一个电话号码:1cn::vicky::model::seri::PhoneNumber* _phone3 = _person2->add_phone();_phone3->set_number("+8613996398667");_phone3->set_type(cn::vicky::model::seri::MOBILE);// 创建角色中的一个电话号码:2cn::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 << "byteSize = " << byteSize << std::endl;char buf[byteSize];bzero(buf, byteSize);u.SerializeToArray(buf, byteSize);// 建立redis链接redisContext *c;redisReply *reply;struct timeval timeout = {1, 500000}; // 1.5 secondsc = redisConnectWithTimeout((char*) "127.0.0.1", 3307, timeout);if (c->err) {printf("Connection error: %s\n", c->errstr);exit(1);}// 第一次执行:将对象写入redis数据库// reply = (redisReply*) redisCommand(c, "SET %b %b", u.username().c_str(), (int) u.username().length(), buf, byteSize); // 重点!!!// printf("SET (binary API): %s\n", reply->str);// freeReplyObject(reply);// 第二次执行:从redis数据库读取对象数据reply = (redisReply*) redisCommand(c, "Get Jack");std::cout << "reply->len = " << reply->len << "\nreply->str : \n" << reply->str << std::endl; // 这里打印不完std::cout << "---------------------------" << std::endl;cn::vicky::model::seri::User u2;u2.ParseFromArray(reply->str, reply->len);std::cout << u2.id() << std::endl;std::cout << u2.username() << std::endl;std::cout << u2.password() << std::endl;std::cout << u2.email() << std::endl;std::cout << "---------------------------" << std::endl;for (int i = 0; i < u2.person_size(); i++) {cn::vicky::model::seri::P补充:软件开发 , C++ ,
上一个:内存对齐
下一个:C++实现UrlEncode和UrlDecode
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊