#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; }