boost序列化

#include <iostream>
#include <boost/serialization/serialization.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <sstream>
#pragma warning (disable: 4244)    //解决boost 中binary序列化:“std::streamsize”转换到“size_t”
using namespace std;
//这里的输入输出,从stringstream到ia或者oa
//序列化,文本模式可以用char*然后分配内存,个人认为是流的方式string中是没有/0的然后strcpy(*json, ss.str().c_str());就会出错,下面的解析就有问题
//void packetage(char** json, int& len)//不能直接用char* json,因为传递的指针的值会变,需要传递指针的地址
//{
//    std::stringstream ss;
//    //binary_oarchive表示输出到ss中,这也是用stringstream作为中介的,估计也是用stringstream作为存储的,从oa输出到ss中
//    boost::archive::text_oarchive oa(ss);
//    int a = 1;
//    int b = 2;
//    oa << a << b;
//    *json = new char[ss.str().size() + 1];
//    strcpy(*json, ss.str().c_str());
//    len = ss.str().size();
//}
//对于流的方式只能只能传递一个string,然后json = ss.str();
void packetage(std::string& json, int& len)//不能直接用char* json,因为传递的指针的值会变,需要传递指针的地址
{
    std::stringstream ss;
    //binary_oarchive表示输出到ss中,这也是用stringstream作为中介的,估计也是用stringstream作为存储的,从oa输出到ss中
    boost::archive::binary_oarchive oa(ss);
    int a = 1;
    int b = 2;
    oa << a << b;
    json = ss.str();
    //strcpy(*json, ss.str().c_str());//个人感觉这里数据就出错了
    len = ss.str().size();
}

//void parse(char* json, int len)
//{
//    //由于这个是流的方式而不是文本的方式,所以需要长度
//    //std::stringstream ss(json);//这种方式不行,因为是流,对于文本模式可以
//    std::stringstream ss(json);
//    //ss.write(json, len);//需要根据长度手动写入到ss中
//    boost::archive::text_iarchive ia(ss);//这个是表示输入,只是从stringstream输入到ia中
//    int a;
//    int b;
//    ia >> a >> b;
//}

void parse(const char* json, int len)
{
    //由于这个是流的方式而不是文本的方式,所以需要长度
    //std::stringstream ss(json);//这种方式不行,因为是流,对于文本模式可以
    std::stringstream ss;
    ss.write(json, len);//需要根据长度手动写入到ss中
    boost::archive::binary_iarchive ia(ss);//这个是表示输入,只是从stringstream输入到ia中
    int a;
    int b;
    ia >> a >> b;
}

int main()
{
    //char* json = NULL;
    std::string json;
    int len = 0;
    packetage(json, len);
    parse(json.c_str(), len);//c_str()返回首字符的地址
    getchar();
    return 0;
}

 

posted @ 2014-09-15 00:14  zzyoucan  阅读(1217)  评论(0编辑  收藏  举报