原创:http://blog.csdn.net/uo7801/article/details/68491302
1.下载msgpack https://github.com/msgpack/msgpack-c/tree/cpp-2.1.1。
2.解压进入工程目录打开vs工程
编译生成,默认是生成静态lib
3.下载zlib https://github.com/madler/zlib/tree/v1.2.3
注:静态库只需要编译zlibstat, dll只需要编译zlibvc
4.建立新的工程包含 “msgpack.hpp” 和 “zlib.h” 添加前面的生成的两个lib
尝试使用msgpack的压缩类zbuffer,在msgpack.hpp文件里面添加 #include “msgpack/zbuffer.hpp” 和#include “msgpack/zbuffer.h”
实测序列化压缩可以,没找到解压还原的方法…尴尬
最后采用sbuffer类
pack->压缩->二进制保存
二进制读取->解压缩->upack
贴代码:
#include "stdafx.h"
#include "zlib.h"
#include "iostream"
#include "msgpack.hpp"
#include "fstream"
using namespace std;
unsigned char src[999999];
unsigned char strDst[999999];
unsigned char buf[999999];
int main()
{
msgpack::sbuffer buffer_;
msgpack::packer<msgpack::sbuffer> _pack(&buffer_);
int i=10;
int num1=1;
while (num1<1000)
{
test t1(num1,num1,num1,NULL,num1,num1); //测试数据结构
_pack.pack(t1);
num1++;
}//序列化完成
// std::ofstream of_2("t2.dat",std::ios::binary);
// of_2.write(buffer_.data(),buffer_.size());
// of_2.close();
std::ofstream of_("t1.dat",std::ios::binary);
unsigned char *p=new unsigned char[buffer_.size()+1];
cout<<buffer_.size()<<endl;
unsigned long bufLen = sizeof(buf);
memcpy(p,buffer_.data(),buffer_.size());
compress(buf, &bufLen,p,buffer_.size());压缩完成
of_.write((const char*)buf,bufLen);
of_.close();//写数据完成
delete [] p;
buffer_.release();
std::ifstream is("1.dat",std::ios::binary);//读数据
is.seekg (0, is.end);
int n = is.tellg();
is.seekg (0, is.beg);
char *pp=new char[n+1];
is.read((char*)pp, n);
msgpack::unpacker unpack_;
memcpy(src,pp,n);
unsigned long dstLen = sizeof(strDst);
int nu = uncompress(strDst, &dstLen, src, n);//解压
unpack_.reserve_buffer(dstLen);
memcpy(unpack_.buffer(),strDst,dstLen);
unpack_.buffer_consumed(dstLen);
msgpack::unpacked result_;//unpack
while (unpack_.next(result_))
{
std::cout << result_.get() << std::endl;
}
system("pause");
return 0;
}
注:引入zlib库在编译工程时候要添加预处理 ZLIB_WINAPI
报错error LNK2026: 模块对于 SAFESEH 映像是不安全的,解决办法在工程配置属性,配置属性,连接器,命令行添加“/SAFESEH:NO ”
测试至此做个记录。
原创:http://blog.csdn.net/uo7801/article/details/68491302