• 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;
    }
  • 相关阅读:
    bzoj 1015: [JSOI2008]星球大战starwar【并查集】
    bzoj 1026: [SCOI2009]windy数【数位dp】
    bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】
    bzoj 4198: [Noi2015]荷马史诗【哈夫曼树+贪心】
    bzoj 1093: [ZJOI2007]最大半连通子图【tarjan+拓扑排序+dp】
    bzoj 3209: 花神的数论题【数位dp】
    bzoj [JSOI2010]Group 部落划分 Group【二分+并查集】
    bzoj 1087: [SCOI2005]互不侵犯King【状压dp】
    bzoj 2730: [HNOI2012]矿场搭建【tarjan】
    bzoj 1878: [SDOI2009]HH的项链【树状数组】
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/3972025.html
Copyright © 2020-2023  润新知