How to make a non Cobject derived class serializable.
Kalyan -- chakri@sunserv.cmc.stph.net Thursday, October 10, 1996 Environment : Win95, VC++ 4.1 Hi all, I have a class which is not derived from CObject and I would like to make the class serializable. The class is like this : class minutia : public CPoint { public : float lefCurvature, rightCurvature; operator >> (ofstream& ofs); operator << (ifstream& ifs); operator >> (Display& d); }; Any help in this regard would be appreciated. Thanx, Kalyan.V --------------------------------------------------------------- Kalyana Chakravarthy.V Ph : +91-040-259401/259501 Engineer (R&D), Fax : +91-040-259509 CMC Limited, Hyderabad, A.P., Email : chakri@hp735.cmc.stph.net INDIA. chakri@sunserv.cmc.stph.net ---------------------------------------------------------------
Gerry Sweeney -- gerry@hornbill.com Friday, October 11, 1996 [Mini-digest: 6 responses] Environment : Win95, VC++ 4.1 The following should work:- // Instance of your class minutia myInstance; // An archive object CArchive ar; ... // To store your object ar.Write(&myInstance, sizeof(minutia)); // To load your object ar.Read(&myInstance, sizeof(minutia)); Please note that there is no checking done here so If you archive is not a the right position when you read or write you will get problems. This code also assumes the following:- 1. The object is always a fixed size 2. There are no pointers stored within the class 3. There are not variable 'size' objects contained within the class Hope this helps Gerry Sweeney gerry@hornbill.com >Hi all, > I have a class which is not derived from CObject and I would like > to make the class serializable. The class is like this : > > class minutia : public CPoint { > public : > float lefCurvature, rightCurvature; > > operator >> (ofstream& ofs); > operator << (ifstream& ifs); > operator >> (Display& d); > }; > Any help in this regard would be appreciated. >Thanx, >Kalyan.V >--------------------------------------------------------------- > Kalyana Chakravarthy.V Ph : +91-040-259401/259501 > Engineer (R&D), Fax : +91-040-259509 > CMC Limited, > Hyderabad, A.P., Email : chakri@hp735.cmc.stph.net > INDIA. chakri@sunserv.cmc.stph.net --------------------------------------------------------------- -----From: "Robertson David"What about this: class minutia.... { . . . virtual void Serialize(CArchive& ar); . . . }; void minutia::Serialize(CArchive& ar) { if (ar.IsStoring()) { // Store members here. } else { // Load members here. } } And then call this from one of you other serialization handlers. -----From: Ash Williams Kaylan, Sounds to me like you need a containment relationship, ie you can't derive from CObject (no multiple inheritence in MFC) so make a CObject derived instance a member of your class and pass on all serialize requests to that member: ************************************************************* (I've taken the liberty of changing your operator overloads to Serialize - you should be able to change it back. Also if it doesn't compile, make the nested class not nested, since the microsoft macros might not like it) class minutia : public CPoint { private: // nested CObject derived class class Mydata : public CObject { DECLARE_DYNCREATE(Mydata) public: Mydata( minutia& rContainer ) { m_pContainer = rContainer; } virtual void Serialize( CArchive& ar ) { if(ar.IsStoring()) { ar << m_pContainer->x; ar << m_pContainer->y; ar << m_pContainer->lefCurvature; ar << m_pContainer->rightCurvature; } else { ar >> m_pContainer->x; ar >> m_pContainer->y; ar >> m_pContainer->lefCurvature; ar >> m_pContainer->rightCurvature; } } private: minutia* m_pContainer = &rContainer; }; public : float lefCurvature, rightCurvature; virtual void Serialize( CArchive& ar ) { Mydata data(*this); data.Serialize(ar); } // operator >> (ofstream& ofs); // operator << (ifstream& ifs); // operator >> (Display& d); }; IMPLEMENT_DYNCREATE(minutia::Mydata, CObject) ************************************************************* Hope this nearly compiles/works, Ash -----From: mss@tartus.com (Michael Scherotter) Implement void Serialize(CArchive& ar) void minutia::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar << lefCurvature; ar << rightCurvature; } else { ar >> lefCurvature; ar >> rightCurvature; } -- Michael S. Scherotter |Architectural Design Tools Lead Software Developer |AutoCAD Applications Tartus Development, Inc. |Custom CAD Solutions 630 Las Gallinas Ave #300 |__________________________ San Rafael, CA 94903 mailto:mss@tartus.com (415) 491-8925 mailto:michael@charette.com (415) 491-8921 (fax) mailto:71035.1675@compuserve.com http://www.tartus.com/people/mss ____________________________________________________________ -----From: Slh1995@aol.com IMHO the easiest way would be to add your data members to some class that is serializable, then in that serialize method, read/write the data and just copy the data (after creating a new object yourself when reading). You can create a dummy CObject-based class for this or use any other serializable class. -Steve -----From: Amit Ramon Hi Kalyan, Define these two functions: CArchive& AFXAPI operator<<(CArchive& ar, const minutia& m) { ar << m.x << m.y; } CArchive& AFXAPI operator>>(CArchive& ar, minutia & m); { ar >> m.x >> m.y; } (if the data members that you want to serialize are private, make this functions friends of your class). Now you can do that in your CDocument derived class Serialize() function (assuming you have a member variable minutia m_minuta): MyDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) ar << m_minutia; else ar >> m_minutia; } You can define this pair of funcions for any class that you wish to serialize, no matter how complex it is. For more complex data members (e.g. arrays) you can use the CArchive::Read and CArchive::Write methods. For a good example, look at the MFC source code for serializing a CString (arccore.cpp). Hope it helps, Amit. ---------------------------------- Amit Ramon amitra@ix.netcom.com ----------------------------------
| Вернуться в корень Архива |