在网络编程中。一个常常的操作是将本地的数据块转换成字符流并将其发送到远端。远端将这个字符串流恢复成数据库。如果有例如以下一个类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 << " "; 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()] = '