Boost logo

Boost Users :

Subject: Re: [Boost-users] Boost::Serialization and MFC Doc/View architecture
From: Colin Caprani (cc.caprani_at_[hidden])
Date: 2011-07-03 12:24:17


I hope you don't mind, but I've a bit more information on this:

Reading the documentation closer, I see that Boost acknowledges that any
serialized pointer is deserialized with a new keyword: "Serialization of
pointers is implemented in the library with code similar to the following:"

// load data required for construction and invoke constructor in place
template<class Archive, class T>
inline void load_construct_data(
Archive & ar, T * t, const unsigned int file_version
){
// default just uses the default constructor to initialize
// previously allocated memory.
::new(t)T();
}

The documentation recommends overloading this function if necessary:

template<class Archive>
inline void load_construct_data(
Archive & ar, my_class * t, const unsigned int file_version
){
// retrieve data from archive required to construct new instance
int attribute;
ar >> attribute;
// invoke inplace constructor to initialize instance of my_class
::new(t)my_class(attribute);
}

But this would again result in needed to implement a CMyDoc copy
constructor.

Any help very much appreciated - thank you.
Colin

On Sun, Jul 3, 2011 at 1:31 AM, Colin Caprani <cc.caprani_at_[hidden]> wrote:

> Hi All,
>
> I'm porting an existing MFC C++ application to use Boost::Serialization for
> XML files. My CDocument object contains all the data for the app. I've
> implemented the serialize function as:
>
> template<class Archive>
> void CMyDoc::serialize(Archive& ar, const unsigned int version)
> {
> ar & BOOST_SERIALIZATION_NVP(m_Param1)
> & BOOST_SERIALIZATION_NVP(m_Param2);
> }
>
> To capture the save and load events, in the CMyDoc.cpp file I have:
>
> BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName)
> {
> clear(); // clear current params
>
> //if (!CDocument::OnOpenDocument(lpszPathName)) // Old MFC serialize
> code
> // return FALSE;
>
> CEvolveTrafficDoc* pDoc = this; // pointers the same here
> std::ifstream ifs(lpszPathName);
> boost::archive::xml_iarchive ia(ifs);
> ia >> boost::serialization::make_nvp("MyDoc",pDoc); // pointer changes
> here
>
> return TRUE;
> }
>
> BOOL CMyDoc::OnSaveDocument(LPCTSTR lpszPathName)
> {
> //if (!CDocument::OnSaveDocument(lpszPathName)) // Old MFC serialize
> code
> // return FALSE;
>
> std::ofstream ofs(lpszPathName);
> boost::archive::xml_oarchive oa(ofs);
> oa << boost::serialization::make_nvp("MyDoc",this);
>
> return TRUE;
> }
>
> Saving a document works fine. The problem is that loading a document
> doesn't work. The boost library seems to copy the CMyDoc object because the
> pointer comes back a different address. This means that the loaded file
> isn't loaded into the current document. Can a CDoc overwrite itself with
> boost? It can with MFC CArchive.
>
> If I overload the CMyView to capture the file open and save events, the MRU
> list management offered by the Doc/View architecture won't happen.
>
> I'm sure this has been done a million times, but I can't find any
> information online. Weird! Any help much appreciated.
>
> Thanks,
>
> Colin
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net