7 C++ Boost 序列化
1,关于序列化.png2,关于序列化.png3,关于序列化.png将结构体写入文件name存在空格,C++的序列化相当的脆弱C++序列化二进制版C风格的序列化,总是正常的boost序列化C风格写入到文件simpleboost序列化C++风格写入到文件simpleboost序列化从文件中读取非侵入式的boost序列化缺点:所有的成员必须是public可序列化的成员派生类的序列化,问题引出,父类的成员增删对序列化有影响.耦合度太高派生类的序列化问题解决指针的序列化两个指针指向同一片区域,序列化到文件,只保存一份智能指针的序列化数组的序列化指针数组的序列化STL容器的序列化将对象序列化为XML描述
将结构体写入文件
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>usingnamespacestd;structUser{stringname;stringemail;intage;};ostream&operator<<(ostream&os,constUser&user){//空格分开,方便stream的读入returnos<<user.name<<""<<user.email<<""<<user.age;}istream&operator>>(istream&is,User&user){returnis>>user.name>>user.email>>user.age;}intmain(){Useruser1={"chunli","li_chunli@mail.com",24};Useruser2={"林冲","林冲@email.com",30};ofstreamfout("user.txt");//为了演示,省略检查机制fout<<user1<<endl;//写入到文件fout<<user2<<endl;//写入到文件Useruser3;Useruser4;ifstreamfin("user.txt");fin>>user3;fin>>user4;cout<<user3<<endl;cout<<user4<<endl;return0;}chunli@Linux:~/boost$>user.txtchunli@Linux:~/boost$g++main.cpp&&./a.outchunlili_chunli@mail.com24林冲林冲@email.com30chunli@Linux:~/boost$catuser.txtchunlili_chunli@mail.com24林冲林冲@email.com30chunli@Linux:~/boost$
name存在空格,C++的序列化相当的脆弱
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>usingnamespacestd;structUser{stringname;stringemail;intage;};ostream&operator<<(ostream&os,constUser&user){//空格分开,方便stream的读入returnos<<user.name<<""<<user.email<<""<<user.age;}istream&operator>>(istream&is,User&user){returnis>>user.name>>user.email>>user.age;}intmain(){Useruser1={"lichunli","li_chunli@mail.com",24};Useruser2={"林冲","林冲@email.com",30};ofstreamfout("user.txt");//为了演示,省略检查机制fout<<user1<<endl;//写入到文件fout<<user2<<endl;//写入到文件Useruser3;Useruser4;ifstreamfin("user.txt");fin>>user3;fin>>user4;cout<<user3<<endl;cout<<user4<<endl;return0;}chunli@Linux:~/boost$>user.txtchunli@Linux:~/boost$g++main.cpp&&./a.outlichunli0335933440chunli@Linux:~/boost$catuser.txtlichunlili_chunli@mail.com24林冲林冲@email.com30chunli@Linux:~/boost$
C++ 序列化 二进制版
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>usingnamespacestd;structUser{stringname;stringemail;intage;};intmain(){Useruser1={"lichunli","li_chunli@mail.com",24};Useruser2={"林冲","林冲@email.com",30};ofstreamfout("user.bin");//为了演示,省略检查机制fout.write((constchar*)&user1,sizeof(structUser));fout.write((constchar*)&user2,sizeof(structUser));fout.close();Useruser3;Useruser4;ifstreamfin("user.bin");fin.read((char*)&user3,sizeof(structUser));cout<<user3.name<<","<<user3.email<<","<<user3.age<<endl;fin.read((char*)&user3,sizeof(structUser));cout<<user3.name<<","<<user3.email<<","<<user3.age<<endl;fin.close();return0;}chunli@Linux:~/boost$g++main.cpp-Wall-g&&./a.outlichunli,li_chunli@mail.com,24林冲,林冲@email.com,30***Errorin`./a.out':doublefreeorcorruption(fasttop):0x00000000008a90b0***已放弃(核心已转储)chunli@Linux:~/boost$
C风格的 序列化,总是正常的
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>usingnamespacestd;structUser{charname[100];charemail[100];intage;};intmain(){Useruser1={"lichunli","li_chunli@mail.com",24};Useruser2={"林冲","林冲@email.com",30};ofstreamfout("user.bin");//为了演示,省略检查机制fout.write((constchar*)&user1,sizeof(structUser));fout.write((constchar*)&user2,sizeof(structUser));fout.close();Useruser3;ifstreamfin("user.bin");fin.read((char*)&user3,sizeof(structUser));cout<<user3.name<<","<<user3.email<<","<<user3.age<<endl;fin.read((char*)&user3,sizeof(structUser));cout<<user3.name<<","<<user3.email<<","<<user3.age<<endl;fin.close();return0;}chunli@Linux:~/boost$g++main.cpp-Wall-g&&./a.outlichunli,li_chunli@mail.com,24林冲,林冲@email.com,30chunli@Linux:~/boost$
boost 序列化C风格 写入到文件simple
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>usingnamespacestd;structUser{charname[16];charemail[64];intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name;//ar&name&email&age;ar&email;ar&age;}};intmain(){Useruser1={"智多星","吴用@email.com",40};Useruser2={"豹子头","林冲@email.com",30};ofstreamfout("user_info");//为了演示,省略检查机制boost::archive::text_oarchiveoa(fout);oa<<user1;oa<<user2;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization-Wall&&./a.outchunli@Linux:~/boost$catuser_info22serialization::archive140016-26-103-70-27-92-102-26-104-97000000064-27-112-76-25-108-88641011099710510846991111090000000000000000000000000000000000000000000000004016-24-79-71-27-83-112-27-92-76000000064-26-98-105-27-122-786410110997105108469911110900000000000000000000000000000000000000000000000030chunli@Linux:~/boost$
boost 序列化C++风格 写入到文件simple
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>usingnamespacestd;structUser{stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name;//ar&name&email&age;ar&email;ar&age;}};intmain(){Useruser1={"智多星","吴用@email.com",40};Useruser2={"豹子头","林冲@email.com",30};ofstreamfout("user_info");//为了演示,省略检查机制boost::archive::text_oarchiveoa(fout);oa<<user1;oa<<user2;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization-Wall&&./a.outchunli@Linux:~/boost$catuser_info22serialization::archive14009智多星16吴用@email.com409豹子头16林冲@email.com30chunli@Linux:~/boost$
boost 序列化从文件中读取
chunli@Linux:~/boost$>user_infochunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>usingnamespacestd;structUser{stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name;//ar&name&email&age;ar&email;ar&age;}};intmain(){Useruser1={"智多星","吴用@email.com",40};Useruser2={"豹子头","林冲@email.com",30};ofstreamfout("user_info");//为了演示,省略检查机制boost::archive::text_oarchiveoa(fout);oa<<user1<<user2;fout.close();Useruser_tmp;ifstreamfin("user_info");boost::archive::text_iarchiveia(fin);ia>>user_tmp;cout<<user_tmp.name<<","<<user_tmp.email<<","<<user_tmp.age<<endl;ia>>user_tmp;cout<<user_tmp.name<<","<<user_tmp.email<<","<<user_tmp.age<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization-Wall&&./a.out智多星,吴用@email.com,40豹子头,林冲@email.com,30chunli@Linux:~/boost$catuser_info22serialization::archive14009智多星16吴用@email.com409豹子头16林冲@email.com30chunli@Linux:~/boost$
非侵入式的 boost序列化 缺点:所有的成员必须是public
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>usingnamespacestd;structUser{stringname;stringemail;intage;};template<classArchive>voidserialize(Archive&ar,User&user,constunsignedversion){ar&user.name&user.email&user.age;}intmain(){Useruser1={"智多星","吴用@email.com",40};Useruser2={"豹子头","林冲@email.com",30};ofstreamfout("user_info");//为了演示,省略检查机制boost::archive::text_oarchiveoa(fout);oa<<user1<<user2;fout.close();Useruser_tmp;ifstreamfin("user_info");boost::archive::text_iarchiveia(fin);ia>>user_tmp;cout<<user_tmp.name<<","<<user_tmp.email<<","<<user_tmp.age<<endl;ia>>user_tmp;cout<<user_tmp.name<<","<<user_tmp.email<<","<<user_tmp.age<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization-Wall&&./a.out智多星,吴用@email.com,40豹子头,林冲@email.com,30chunli@Linux:~/boost$catuser_info22serialization::archive14009智多星16吴用@email.com409豹子头16林冲@email.com30chunli@Linux:~/boost$chunli@Linux:~/boost$
可序列化的成员
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<iterator>#include<boost/serialization/vector.hpp>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>usingnamespacestd;structUser{stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name&email&age;}};structGroup{stringgid;Userleader;vector<User>members;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&gid&leader&members;}};ostream&operator<<(ostream&os,constUser&user){returnos<<user.name<<","<<user.email<<","<<user.age<<endl;}intmain(){Useruser1={"智多星","吴用@email.com",40};Useruser2={"豹子头","林冲@email.com",30};Useruser3={"及时雨","宋江@email.com",42};Useruser4={"黑旋风","李逵@email.com",37};Groupgroup;group.gid="8080";group.leader=user1;group.members.push_back(user2);group.members.push_back(user3);group.members.push_back(user4);//写入到文件ofstreamfout("group_info");boost::archive::text_oarchiveoa(fout);oa<<group;fout.close();//从文件中读取Groupgroup2;ifstreamfin("group_info");boost::archive::text_iarchiveia(fin);ia>>group2;cout<<group2.leader;//copy(group2.members.begin(),group2.members.end(),ostream_iterator<User>(cout,"OK"));copy(group2.members.begin(),group2.members.end(),ostream_iterator<User>(cout));return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization-Wall&&./a.out智多星,吴用@email.com,40豹子头,林冲@email.com,30及时雨,宋江@email.com,42黑旋风,李逵@email.com,37chunli@Linux:~/boost$catgroup_info22serialization::archive140048080009智多星16吴用@email.com4000309豹子头16林冲@email.com309及时雨16宋江@email.com429黑旋风16李逵@email.com37chunli@Linux:~/boost$chunli@Linux:~/boost$
派生类的序列化,问题引出,父类的成员增删对序列化有影响.耦合度太高
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<iterator>#include<boost/serialization/vector.hpp>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>usingnamespacestd;structUser{stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name&email&age;}};structVIP:publicUser{intlevel;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&email;//将成员序列化到IOar&level;ar&name;}};intmain(){VIPvip1;vip1.level=100;vip1.name="黑旋风";vip1.email="likui@mail.com";ofstreamfout("users_vip");boost::archive::text_oarchiveoa(fout);oa<<vip1;fout.close();VIPvip2;ifstreamfin("users_vip");boost::archive::text_iarchiveia(fin);ia>>vip2;cout<<vip2.level<<endl;cout<<vip2.name<<endl;cout<<vip2.email<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization-Wall&&./a.out100黑旋风likui@mail.comchunli@Linux:~/boost$catusers_vip22serialization::archive140014likui@mail.com1009黑旋风chunli@Linux:~/boost$chunli@Linux:~/boost$
派生类的序列化 问题解决
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<iterator>#include<boost/serialization/vector.hpp>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>usingnamespacestd;structUser{stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name&email&age;}};structVIP:publicUser{intlevel;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&boost::serialization::base_object<User>(*this);//将父类序列化,不再管父类有多少个成员ar&level;}};intmain(){VIPvip1;vip1.level=100;vip1.name="黑旋风";vip1.age=34;vip1.email="likui@mail.com";ofstreamfout("users_vip");boost::archive::text_oarchiveoa(fout);oa<<vip1;fout.close();VIPvip2;ifstreamfin("users_vip");boost::archive::text_iarchiveia(fin);ia>>vip2;cout<<vip2.level<<endl;cout<<vip2.name<<endl;cout<<vip2.email<<endl;cout<<vip2.age<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization-Wall&&./a.out100黑旋风likui@mail.com34chunli@Linux:~/boost$catusers_vip22serialization::archive1400009黑旋风14likui@mail.com34100chunli@Linux:~/boost$chunli@Linux:~/boost$
指针的序列化
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<iterator>#include<boost/serialization/vector.hpp>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>usingnamespacestd;classUser{public:User():name(),email(),age(){}User(conststring&_name,conststring&_email,constint&_age):name(_name),email(_email),age(_age){}stringgetName()const//函数体内不能对成员数据做任何改动{returnname;}stringgetEmail()const//函数体内不能对成员数据做任何改动{returnemail;}intgetAge()const//函数体内不能对成员数据做任何改动{returnage;}private:stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name&email&age;}};intmain(){User*user1=newUser("及时雨","songjiang@mail.com",37);ofstreamfile("user.info");boost::archive::text_oarchiveoa(file);oa<<user1;file.close();deleteuser1;User*user2;ifstreamfin("user.info");//boost::archive::text_iarchiveia(fin);boost::archive::text_iarchiveia(fin);ia>>user2;cout<<"name="<<user2->getName()<<",email="<<user2->getEmail()<<",age="<<user2->getAge()<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization&&./a.outname=及时雨,email=songjiang@mail.com,age=37chunli@Linux:~/boost$catuser.info22serialization::archive1401009及时雨18songjiang@mail.com37chunli@Linux:~/boost$chunli@Linux:~/boost$
两个指针指向同一片区域,序列化到文件,只保存一份
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<iterator>#include<boost/serialization/vector.hpp>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>usingnamespacestd;classUser{public:User():name(),email(),age(){}User(conststring&_name,conststring&_email,constint&_age):name(_name),email(_email),age(_age){}stringgetName()const//函数体内不能对成员数据做任何改动{returnname;}stringgetEmail()const//函数体内不能对成员数据做任何改动{returnemail;}intgetAge()const//函数体内不能对成员数据做任何改动{returnage;}private:stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name&email&age;}};intmain(){User*user1=newUser("及时雨","songjiang@mail.com",37);User*user2=user1;ofstreamfile("user.info");boost::archive::text_oarchiveoa(file);oa<<user1;oa<<user2;file.close();deleteuser1;User*user3;User*user4;ifstreamfin("user.info");boost::archive::text_iarchiveia(fin);ia>>user3;cout<<"name="<<user3->getName()<<",email="<<user3->getEmail()<<",age="<<user3->getAge()<<endl;ia>>user4;cout<<"name="<<user4->getName()<<",email="<<user4->getEmail()<<",age="<<user4->getAge()<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization&&./a.outname=及时雨,email=songjiang@mail.com,age=37name=及时雨,email=songjiang@mail.com,age=37chunli@Linux:~/boost$catuser.info22serialization::archive1401009及时雨18songjiang@mail.com3700chunli@Linux:~/boost$chunli@Linux:~/boost$问题:以指针序列化,以对象读取,失败
智能指针的序列化
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<iterator>#include<boost/serialization/vector.hpp>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>#include<boost/serialization/shared_ptr.hpp>usingnamespacestd;classUser{public:User():name(),email(),age(){}User(conststring&_name,conststring&_email,constint&_age):name(_name),email(_email),age(_age){}stringgetName()const//函数体内不能对成员数据做任何改动{returnname;}stringgetEmail()const//函数体内不能对成员数据做任何改动{returnemail;}intgetAge()const//函数体内不能对成员数据做任何改动{returnage;}private:stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name&email&age;}};intmain(){User*user1=newUser("及时雨","songjiang@mail.com",37);User*user2=user1;boost::shared_ptr<User>sp1(newUser("花和尚","鲁智深@mail.com",38));boost::shared_ptr<User>sp2=sp1;ofstreamfile("user.info");boost::archive::text_oarchiveoa(file);oa<<user1;oa<<user2;oa<<sp1;oa<<sp2;file.close();deleteuser1;User*user3;ifstreamfin("user.info");boost::archive::text_iarchiveia(fin);ia>>user3;cout<<"name="<<user3->getName()<<",email="<<user3->getEmail()<<",age="<<user3->getAge()<<endl;ia>>user3;cout<<"name="<<user3->getName()<<",email="<<user3->getEmail()<<",age="<<user3->getAge()<<endl;boost::shared_ptr<User>sp3;ia>>sp3;cout<<"name="<<sp3->getName()<<",email="<<sp3->getEmail()<<",age="<<sp3->getAge()<<endl;ia>>sp3;cout<<"name="<<sp3->getName()<<",email="<<sp3->getEmail()<<",age="<<sp3->getAge()<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization&&./a.outname=及时雨,email=songjiang@mail.com,age=37name=及时雨,email=songjiang@mail.com,age=37name=花和尚,email=鲁智深@mail.com,age=38name=花和尚,email=鲁智深@mail.com,age=38chunli@Linux:~/boost$catuser.info22serialization::archive1401009及时雨18songjiang@mail.com370001019花和尚18鲁智深@mail.com3801chunli@Linux:~/boost$chunli@Linux:~/boost$
数组的序列化
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<iterator>#include<boost/serialization/vector.hpp>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>#include<boost/serialization/shared_ptr.hpp>usingnamespacestd;classUser{public:User():name(),email(),age(){}User(conststring&_name,conststring&_email,constint&_age):name(_name),email(_email),age(_age){}stringgetName()const//函数体内不能对成员数据做任何改动{returnname;}stringgetEmail()const//函数体内不能对成员数据做任何改动{returnemail;}intgetAge()const//函数体内不能对成员数据做任何改动{returnage;}private:stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name&email&age;}};intmain(){Userusers[3]={User("及时雨","songjiang@mail.com",37),User("武行者","wusong@mail.com",37),User("花和尚","luzhishen@mail.com",40)};ofstreamfile("user.info");boost::archive::text_oarchiveoa(file);oa<<users;file.close();Userbuf[3];ifstreamfin("user.info");boost::archive::text_iarchiveia(fin);ia>>buf;cout<<buf[0].getName()<<","<<buf[0].getEmail()<<","<<buf[0].getAge()<<endl;cout<<buf[1].getName()<<","<<buf[1].getEmail()<<","<<buf[1].getAge()<<endl;cout<<buf[2].getName()<<","<<buf[2].getEmail()<<","<<buf[2].getAge()<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization&&./a.out及时雨,songjiang@mail.com,37武行者,wusong@mail.com,37花和尚,luzhishen@mail.com,40chunli@Linux:~/boost$catuser.info22serialization::archive143009及时雨18songjiang@mail.com379武行者15wusong@mail.com379花和尚18luzhishen@mail.com40chunli@Linux:~/boost$chunli@Linux:~/boost$
指针数组的序列化
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<iterator>#include<boost/serialization/vector.hpp>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>#include<boost/serialization/shared_ptr.hpp>usingnamespacestd;classUser{public:User():name(),email(),age(){}User(conststring&_name,conststring&_email,constint&_age):name(_name),email(_email),age(_age){}stringgetName()const//函数体内不能对成员数据做任何改动{returnname;}stringgetEmail()const//函数体内不能对成员数据做任何改动{returnemail;}intgetAge()const//函数体内不能对成员数据做任何改动{returnage;}private:stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name&email&age;}};intmain(){User*users[3]={newUser("及时雨","songjiang@mail.com",37),newUser("武行者","wusong@mail.com",37),newUser("花和尚","luzhishen@mail.com",40)};ofstreamfile("user.info");boost::archive::text_oarchiveoa(file);oa<<users;file.close();User*buf[3];ifstreamfin("user.info");boost::archive::text_iarchiveia(fin);ia>>buf;cout<<buf[0]->getName()<<","<<buf[0]->getEmail()<<","<<buf[0]->getAge()<<endl;cout<<buf[1]->getName()<<","<<buf[1]->getEmail()<<","<<buf[1]->getAge()<<endl;cout<<buf[2]->getName()<<","<<buf[2]->getEmail()<<","<<buf[2]->getAge()<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization&&./a.out及时雨,songjiang@mail.com,37武行者,wusong@mail.com,37花和尚,luzhishen@mail.com,40chunli@Linux:~/boost$catuser.info22serialization::archive14301009及时雨18songjiang@mail.com37019武行者15wusong@mail.com37029花和尚18luzhishen@mail.com40chunli@Linux:~/boost$chunli@Linux:~/boost$
STL容器的序列化
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<iterator>#include<boost/serialization/vector.hpp>#include<boost/archive/text_oarchive.hpp>#include<boost/archive/text_iarchive.hpp>usingnamespacestd;structUser{stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&name&email&age;}};structGroup{stringgid;Userleader;vector<User>members;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&gid&leader&members;}};ostream&operator<<(ostream&os,constUser&user){returnos<<user.name<<","<<user.email<<","<<user.age<<endl;}intmain(){Useruser1={"智多星","吴用@email.com",40};Useruser2={"豹子头","林冲@email.com",30};Useruser3={"及时雨","宋江@email.com",42};Useruser4={"黑旋风","李逵@email.com",37};Groupgroup;group.gid="8080";group.leader=user1;group.members.push_back(user2);group.members.push_back(user3);group.members.push_back(user4);//写入到文件ofstreamfout("group_info");boost::archive::text_oarchiveoa(fout);oa<<group;fout.close();//从文件中读取Groupgroup2;ifstreamfin("group_info");boost::archive::text_iarchiveia(fin);ia>>group2;cout<<group2.leader;//copy(group2.members.begin(),group2.members.end(),ostream_iterator<User>(cout,"OK"));copy(group2.members.begin(),group2.members.end(),ostream_iterator<User>(cout));return0;}chunli@Linux:~/boost$g++main.cpp-lboost_serialization-Wall&&./a.out智多星,吴用@email.com,40豹子头,林冲@email.com,30及时雨,宋江@email.com,42黑旋风,李逵@email.com,37chunli@Linux:~/boost$catgroup_info22serialization::archive140048080009智多星16吴用@email.com4000309豹子头16林冲@email.com309及时雨16宋江@email.com429黑旋风16李逵@email.com37chunli@Linux:~/boost$chunli@Linux:~/boost$
将对象序列化为XML描述
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<iterator>#include<boost/archive/xml_oarchive.hpp>#include<boost/archive/xml_iarchive.hpp>#include<boost/serialization/vector.hpp>usingnamespacestd;structUser{stringname;stringemail;intage;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&BOOST_SERIALIZATION_NVP(name);ar&BOOST_SERIALIZATION_NVP(email);ar&BOOST_SERIALIZATION_NVP(age);}};ostream&operator<<(ostream&os,constUser&u){returnos<<u.name<<''<<u.email<<''<<u.age;}structGroup{stringgid;Userleader;vector<User>members;friendclassboost::serialization::access;template<classArchive>voidserialize(Archive&ar,constunsignedversion){ar&BOOST_SERIALIZATION_NVP(gid);ar&BOOST_SERIALIZATION_NVP(leader);ar&BOOST_SERIALIZATION_NVP(members);}};intmain(){Groupgroup;group.gid="G01";Userleader={"tom","tom@abc.com",28};group.leader=leader;Useru1={"tom1","tom1@abc.com",28};Useru2={"tom2","tom2@abc.com",28};Useru3={"tom3","tom3@abc.com",28};group.members.push_back(u1);group.members.push_back(u2);group.members.push_back(u3);ofstreamfout("users_xml");boost::archive::xml_oarchiveoa(fout);oa<<BOOST_SERIALIZATION_NVP(group);fout.close();Groupg2;ifstreamfin("users_xml");boost::archive::xml_iarchiveia(fin);ia>>BOOST_SERIALIZATION_NVP(g2);cout<<g2.leader<<endl;copy(g2.members.begin(),g2.members.end(),ostream_iterator<User>(cout,"\n"));}chunli@Linux:~/boost$g++main.cpp-lboost_serialization&&./a.outtomtom@abc.com28tom1tom1@abc.com28tom2tom2@abc.com28tom3tom3@abc.com28chunli@Linux:~/boost$catusers_xml<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><!DOCTYPEboost_serialization><boost_serializationsignature="serialization::archive"version="14"><groupclass_id="0"tracking_level="0"version="0"><gid>G01</gid><leaderclass_id="1"tracking_level="0"version="0"><name>tom</name><email>tom@abc.com</email><age>28</age></leader><membersclass_id="2"tracking_level="0"version="0"><count>3</count><item_version>0</item_version><item><name>tom1</name><email>tom1@abc.com</email><age>28</age></item><item><name>tom2</name><email>tom2@abc.com</email><age>28</age></item><item><name>tom3</name><email>tom3@abc.com</email><age>28</age></item></members></group>chunli@Linux:~/boost$chunli@Linux:~/boost$
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。