关于序列化:把某个对象序列化成字节流
2017-05-14 20:08 tlnshuju 阅读(709) 评论(0) 编辑 收藏 举报在网络编程中。一个常常的操作是将本地的数据块转换成字符流并将其发送到远端。远端将这个字符串流恢复成数据库。如果有例如以下一个类CObject。编写两个函数,分别将CObject中的成员变量转换为一个字符流(convert2Stream()函数)。并将字符流的数据又一次恢复到一个CObject对象中(convert2Object()函数):
char* convert2Stream(const CObject* vObject);
CObject* convert2Object(const char* vStream);
class CObject { private: int m_NumSample; std::vector<int> m_Data; bool m_IsDirty; } |
#include <iostream> #include <string> #include <sstream> #include <vector> #include <boost/assign/list_of.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/serialization/access.hpp> #include <boost/serialization/vector.hpp> class CObject { public: CObject() {} ~CObject() {} void printMember() const { std::cout << "Number " << m_NumSample << "\n"; std::cout << "vector: "; for (int i=0; i<m_Data.size(); ++i) { std::cout << m_Data[i] << " "; }std::cout << std::endl; std::cout << "bool " << m_IsDirty << std::endl; } void setValue(int vNumber, const std::vector<int>& vData, bool vB) { m_NumSample = vNumber; m_Data = vData; m_IsDirty = vB; } private: friend boost::serialization::access; template<typename Archive> void serialize(Archive& ar, const unsigned int) { ar & m_NumSample; ar & m_Data; ar & m_IsDirty; } private: int m_NumSample; std::vector<int> m_Data; bool m_IsDirty; }; //********************************************************************************* //FUNCTION: char* convert2Stream(const CObject* vObject) { //没有推断vObject的合法性 std::ostringstream OutStream; boost::archive::text_oarchive OArchive(OutStream); OArchive << vObject; std::string TempString = OutStream.str(); char *pBuffer = new char[TempString.size()+1]; memcpy(pBuffer, TempString.c_str(), TempString.size()); pBuffer[TempString.size()] = '\0'; return pBuffer; } //********************************************************************************* //FUNCTION: 要求vStream是以'\0'结束 CObject* convert2Object(const char* vStream) { int Length = 0; const char *pTemp = vStream; while (*pTemp != '\0') { ++pTemp; ++Length; } if (Length == 0) return NULL; std::string TempString(vStream, Length); std::istringstream InStream(TempString); boost::archive::text_iarchive InArchive(InStream); CObject* pObject = NULL;//这里要传一个空指针,序列化时会申请内存 InArchive >> pObject; return pObject; } int main() { std::vector<int> TempData = boost::assign::list_of(1)(11)(111)(1111)(11111); CObject Obj; Obj.setValue(2, TempData, false); char *pBuf = convert2Stream(&Obj); CObject* pObject = convert2Object(pBuf); assert(pObject != NULL); pObject->printMember(); delete[] pBuf; delete pObject;//注意内存泄露 getchar(); return 0; }