Boost logo

Boost Users :

Subject: Re: [Boost-users] [serialization] Attaching arbitrary data to an archive
From: Stefan Strasser (strasser_at_[hidden])
Date: 2010-06-01 15:07:20


Zitat von Robert Ramey <ramey_at_[hidden]>:

> Noah Roberts wrote:
>> Sometimes during serialization an object needs to know a lot more than
>> it does during normal operation. The way I've dealt with this in the
>> past is to subclass the archive I want to use and add setter/getters
>> for the data that various objects down the line are going to need to
>> store and retrieve themselves.
>>
>> Is there a better way though, something that's built into the library
>> already maybe? I don't see anything but I thought I'd ask.

my solution is pretty similar, but I think somewhat cleaner at least
in my case, because the serialization can depend on the kind of
archive that is used:

instead of the serialize() functions extracting the additional data
they need from the archive, I introduced a new serialization
primitive. in my case, the serialize() function needed to serialize a
type, one out of many, so on load() it needed to know what types to
consider -> stored in the archive.

I also overloaded the archives, but instead of getters/setters there
is something like:

   void load(type_selection &type){ ... }

this decouples the info stored in the archive from the individual
serialize() functions.
also if the archive doesn't implement type_selection as a primitive
its serialize() function is called, so you can react adequately when
an archive is used that isn't subclass-ed.

robert, this seems very similar to pointer serialization to me. if a
pointer is loaded, info stored in the archive is required (the pointer
tracking map). same for derived type serialization.

maybe pointer tracking/derived types can one day be as optional as the
shared_ptr mix-in you described is.

I still use something like this just to avoid the construction
overhead of a Boost.Serialization archive when it's not needed:

class archive{
   archive &operator<<(int t){
     //don't need Boost.Serialization for this
     ...
   }
   archive &operator<<(T *t){
     //need Boost.Serialization for this:
     if(!sarchive) sarchive=in_place(...
     *sarchive << t;
   }
private:
   optional<archive::binary_oarchive...> sarchive;
}

Stefan


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