加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

通讯数据序列化处理 c++ msgpack

(2013-05-21 11:31:04)
标签:

c

msgpack

分类: 各种笔记
'''
Created on 2013-5-21
@author: zhxfl
'''
在搭建开发框架的时候,前端后端进行通信,当语言不同(比如c++和erlang),我们需要一个帮我们解析数据结构的模块,考虑到我们只需要解析int,char*,string,vector这几个基本的数据就够了(像map这种我是觉得没有这种需求的,如果确实需要map,解析之后自己重新去建立就行了),所以选择了msgpack(另外可以选择的是google buff、json等)这个轻量级的序列化解析程序。
需要知道的是,msgpack在做处理的时候,是有做数据压缩的,这显然要比我们自己来要可靠的多。

环境配置

1、按照文档说明做编译处理,编译之后会有一个lib文件,头文件目录include这些都要 一起包含进我们工程里(考虑到要在linux下编译,所以就不直接安装在vs2010上面了。

http://wiki.msgpack.org/display/MSGPACK/QuickStart+for+C+Language

、编译之后,会生成lib目录下msgpack.lib(release),msgpackd.lib(debug),include目录。

在我们的工程目录下建立如下目录

msgpack/include

msgpack/lib

、在vs2010的工程里面做好响应的设置

1)链接器设置(debug版本)

http://s11/mw690/a502f1a3gdd3359fc214a&690c++ msgpack" TITLE="通讯数据序列化处理 c++ msgpack" />

2)链接器设置(release版本)


http://s7/mw690/a502f1a3gdd335bbf6aa6&690c++ msgpack" TITLE="通讯数据序列化处理 c++ msgpack" />

3)在c/c++目录下添加msgpack\include目录

http://s10/mw690/a502f1a3gdd335bf34589&690c++ msgpack" TITLE="通讯数据序列化处理 c++ msgpack" />

4)最后还要添加的是链接目录

http://s3/mw690/a502f1a3gdd335c11f592&690c++ msgpack" TITLE="通讯数据序列化处理 c++ msgpack" />

5)另外release版本的需要单独重复上面的设置


代码如下:
输出结构为
size1 = 36 
size2 = 27
这也说明了msgpack有为我们做数据压缩处理。
// msgpackTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include <msgpack.hpp>
#include <vector>
#include <string>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    // serializes this object.

    msgpack::sbuffer buffer;
    msgpack::packer<msgpack::sbuffer> pac(&buffer);
    int size1 = sizeof(char) * 20;

    std::vector<std::string>vec;
    vec.push_back(std::string("0000000000"));
    vec.push_back(std::string("0000000000"));

    pac.pack(vec);
    int a = 1;
    int b = 2;
    int c = 3;
    int d = 4;
    pac.pack(a);
    pac.pack(b);
    pac.pack(c);
    pac.pack(d);
    size1 += sizeof(int)*4;

    msgpack::unpacker unpac;
    printf("size1 = %d size2 = %d\n", size1, buffer.size());
    unpac.reserve_buffer(buffer.size());
    memcpy(unpac.buffer(), buffer.data(), buffer.size());
    unpac.buffer_consumed(buffer.size());

    msgpack::unpacked res;
    std::vector<std::string>vec1;
    static int i = 0;
    int a2 = 0;
    while (unpac.next(&res))
    {
        if (i == 0)
        {
            res.get().convert(&vec1);
            printf("%s %s\n", vec1[0].c_str(), vec1[1].c_str());
        }
        else
        {
            res.get().convert(&a2);
            printf("%d\n",a2);
        }
        i++;
    }
}


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有