|
Boost Users : |
From: Stathis (stathis_at_[hidden])
Date: 2007-12-01 19:33:49
Robert Ramey wrote:
> Good call - two issues
>
> a) using built-in serialization of collections
> b) saving a pointer to a primitive will result in untracked pointers.
> The proposed solution below addresses this second consideration.
>
> Robert Ramey
>
> Sohail Somani wrote:
>> On Sat, 01 Dec 2007 08:21:47 +0100, Stathis wrote:
>>
>>> Hi,
>>>
>>> What is the right way to serialize/deserialize a container of
>>> pointers, e.g. std::vector< int* > ? I want to store the values, not
>>> the addresses in this case. Should I just flatten my data and store
>>> it in a different fashion, then read the flat data and build my
>>> objects with a builder?
>> I think the main reason is that Boost Serialization doesn't track
>> pointers to the primitives. So I have a feeling you want to use
>> BOOST_STRONG_TYPEDEF (or whatever it is) and use a vector of those
>> things.
>>
>> Then #include <boost/serialization/vector.hpp> and ar & vec_of_ptrs
>>
>> If I am not mistaken, I think the magic should take over from there.
>
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
Hi again,
Thanks for the information. I did look at what you suggested, but it doesn't work when I reduce it
to my case. If instead of a std::list<A*> somelist, I have std::list<int*> it doesn't handle the
serialization of the list (it doesn't compile). Am I not supposed to use it like this?
Even when I use BOOST_STRONG_TYPEDEF to define a new type of int and try to serialize a list of that
type, it still doesn't work.
Here is two things I have tried:
<snip>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/list.hpp>
#define TESTFILE "test.txt"
int main( int /* argc */, char* /* argv */[] )
{
std::list<int*> alist;
alist.push_back(new int);
{
std::ofstream os( TESTFILE );
boost::archive::text_oarchive oa(os);
oa << alist;
}
std::list<int*> alist1;
{
std::ifstream is( TESTFILE );
boost::archive::text_iarchive ia(is);
ia >> alist1;
}
return 0;
}
</snip>
The one above doesn't compile.
I also wrote a different example case:
<snip>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/list.hpp>
#define TESTFILE "test.txt"
class B
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & myVar;
}
int myVar;
public:
B(){};
};
class A
{
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & stuff;
}
std::list<B *> stuff;
public:
A(){}
};
int main( int /* argc */, char* /* argv */[] )
{
const A objA;
{
std::ofstream os( TESTFILE );
boost::archive::text_oarchive oa(os);
oa << objA;
}
A objB;
{
std::ifstream is( TESTFILE );
boost::archive::text_iarchive ia(is);
ia >> objB;
}
return 0;
}
</snip>
which works, but if I change:
std::list<B *> stuff; // in class A
to
std::list<int *> stuff;
it fails to compile.
Can you explain what is wrong with my intended use case and if possible how to do it properly?
Thank you for the help.
regards,
--stathis
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