
On Tue, Aug 10, 2010 at 3:30 AM, Robert Ramey <ramey@rrsd.com> wrote:
I looked into this a little bit.
First I can see the the friend ...access will only work for intrusive serialization.
But I can see that it's straight forward to just make the free save/load functions friend templates - EXCEPT that not all compilers do this.
Robert, I tried your suggestion, but VS2008 didn't compile. I made a few minor tweaks and its working now. Here's what I ended up using: *MyObject.h* ////////////////////////////////////////////////////////////////////////////////////// #pragma once #include "Serializer_MyObject.h" class CMyObject { private: template<class Archive> friend void boost::serialization::save(Archive & ar, const CMyObject& t, unsigned int version); template<class Archive> friend void boost::serialization::load(Archive & ar, CMyObject& t, unsigned int version); int m_nPrivateData; public: CMyObject(void) : m_nPrivateData(123) { } ~CMyObject(void) { } }; *Serializer_MyObject.h* ////////////////////////////////////////////////////////////////////////////////////// #pragma once #include <boost/config.hpp> #include <boost/serialization/split_free.hpp> #include <boost/archive/xml_oarchive.hpp> #include <boost/archive/xml_iarchive.hpp> class CMyObject; BOOST_SERIALIZATION_SPLIT_FREE(CMyObject) namespace boost { namespace serialization { template<class Archive> void save(Archive & ar, const CMyObject& t, unsigned int version) { ar << boost::serialization::make_nvp("CMyObject", t.m_nPrivateData); } template<class Archive> void load(Archive & ar, CMyObject& t, unsigned int version) { ar >> boost::serialization::make_nvp("CMyObject", t.m_nPrivateData); } }} // end boost::serialization namespaces ** ** *main.cpp* ////////////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include <fstream> #include <iostream> #include "MyObject.h" int _tmain(int argc, _TCHAR* argv[]) { std::ofstream ofs("C:\\test.xml"); boost::archive::xml_oarchive oa(ofs); CMyObject obj; oa << BOOST_SERIALIZATION_NVP(obj); ofs.close(); CMyObject newobj; std::ifstream ifs("C:\\test.xml"); boost::archive::xml_iarchive ia(ifs); ia >> BOOST_SERIALIZATION_NVP(newobj);; ifs.close(); } Thanks for your help. Glen