Boost logo

Boost Users :

Subject: Re: [Boost-users] Fwd: Serializing of object with map and multimap. Questions.
From: B Hart (bhartsb_at_[hidden])
Date: 2009-11-06 04:13:57


OvermindDL1: I'd like to see the sample code you mentioned...thanks.

On Thu, Nov 5, 2009 at 12:44 AM, OvermindDL1 <overminddl1_at_[hidden]> wrote:

> On Thu, Nov 5, 2009 at 1:33 AM, B Hart <bhartsb_at_[hidden]> wrote:
> > I have sent a couple of questions to this list in the past week and
> haven't
> > gotten a single response. Wondering if my messages are being bounced???
> >
> > ---------- Forwarded message ----------
> > From: B Hart <bhartsb_at_[hidden]>
> > Date: Wed, Nov 4, 2009 at 3:42 PM
> > Subject: Serializing of object with map and multimap. Questions.
> > To: Boost-users_at_[hidden]
> >
> >
> > I've been having some problems storing and loading a class with a map and
> a
> > multimap. The map contains values that are simple objects of another
> > class. My questions are below. Here is also a link to the same question
> > posted on stackoverflow.
> > Thanks.
> >
> >
> http://stackoverflow.com/questions/1676781/boost-serializing-of-object-containing-map-with-object-values-and-multimap-wit
> >
> > See below a main() and two very simple classes. Then per Boost
> serialization
> > (and what is shown) my questions are:
> >
> > 1) Does class B need the normal overloaded stream insertion operators
> '<<'
> > and '>>' to be defined? Currently in my real code it doesn't have these.
> >
> > 2) Does class A in the store() and load() methods need to iterate through
> > the map and multimap containers explicitly, storing/loading their
> key:value
> > pairs explicitely? e.g. something like:
> >
> > void A::store(const char* filename){
> >
> >
> >
> > std::ofstream ofs(filename);
> > boost::archive::text_oarchive oa(ofs);
> >
> >
> >
> > std::map< std::string, B >::iterator it;
> >
> >
> > BMap.size();
> > oa << BMap.size();
> >
> > for( it = BMap.begin(); it != BMap.end(); it++ ){
> >
> >
> > oa << it->first;
> > oa << it->second;
> >
> >
> > }
> >
> > //similar for strMultimap
> > }
> >
> > I assume that I don't need to do this, but am not certain.
> >
> > 3) Assuming class B has only the two data members shown, does it need a
> > default contructor included explicitely? (as opposed to the implicit
> default
> > constructor)
> >
> > 4) Does B need to have an overide for the comparison operator '>'? I
> assume
> > that it doesn't since this is a very simple class.
> >
> > Finally, any other comments per anything that I've failed to cover is
> > appreciated!
> >
> > Example code for my above questions:
> >
> > //includes ommitted
> >
> > int main() {
> >
> >
> > std::string file("test.dat");
> >
> >
> > A * pA = new A;
> >
> >
> > pA->store(file.c_str());
> >
> > pA->fillMaps();
> > //release data
> > pA->load(file.c_str());
> >
> >
> >
> > return 0;
> > }
> >
> > //includes ommitted
> >
> >
> > class A
> > {
> > friend class boost::serialization::access;
> >
> >
> >
> > public:
> >
> > std::map< std::string, B > BMap;
> >
> >
> > std::multimap< std::string, std::string > strMultimap;
> >
> >
> >
> > template<class Archive>
> > void serialize(Archive & ar, const unsigned int version)
> >
> >
> > {
> > ar & BMap;
> > ar & strMultimap;
> >
> > }
> >
> > void store(const char* filename){
> >
> >
> > std::ofstream ofs(filename);
> > boost::archive::text_oarchive oa(ofs);
> >
> >
> > oa << this;
> > }
> >
> > void load(const char* filename){
> >
> >
> >
> > std::ifstream ifs(filename);
> > boost::archive::text_iarchive ia(ifs);
> >
> >
> > ia >> this;
> >
> > }
> >
> > void fillMaps(){
> >
> >
> > //code to allocate B objects and put them in BMap and fill strMultimap
> with
> > whatever number of key:value pairs
> >
> > }
> >
> >
> > class B
> > {
> > friend class boost::serialization::access;
> >
> >
> >
> > public:
> >
> > std::string str;
> >
> > unsigned int num;
> >
> > B::B(void)
> >
> > : str("a string")
> > , num(7)
> >
> > {
> > }
> >
> > template<class Archive>
> >
> > void serialize(Archive & ar, const unsigned int version)
> >
> >
> > {
> > ar & str;
> > ar & num;
> >
> > }
> > }
>
> We see your emails. I am not a Boost.Serialization guru though, but
> let me see if I can help any (take anything I say with a grain of
> salt, I use Boost.Serialization, but it seems to just 'work' for me
> most of the time so I do not know much about it):
>
> 1) I do not think so, just either an internal or external
> Boost.Serialization streaming functions as normal.
>
> 2) No, Boost.Serialization should already have overloads to handle
> map's properly, if not then there is plenty of code (and I can post
> mine that I map for the tr1 maps and set) out there to do that already
> the 'proper' way. :)
>
> 3) You should not need to explicitly create a default constructor,
> but the class must be default constructable (found that out the hard
> way).
>
> 4) Since you only use B as the data element of a map, no.
>
>
> And the reason you might not be getting responses, you should title
> your posts appropriately, at the front of you title you should put
> [Serialization] as many people filter boost email based on the sub
> library, so you title should have been.
>
> [Serialization] Serializing of object with map and multimap. Questions.
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users



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