"Martin Proulx" <mproulx@okiok.com> wrote in message news:431DE771.6080307@okiok.com...

Hello,

While using the latest release of boost, I've encountered a few questions concerning the usage of the serialization library with objects without default constructors.

Here they are:

1-) How can we construct an instance of a serialized object that doesn't have a default constructor?

The only option I've figured out is to normally construct an object with bogus values, then unserialize the real values while reading from the archive.  Example:

X(0) val; // 0 being some bogus value.
inputStream >> val; // Overwrites all values within val;

Is this the correct way to do things?
 
No..  But I think what you want can be found in the manual in section:  If you specialize save/load construct data you will get what you want.  Use construct in place inside of load construct data.
Reference/Serializable/Concept/Pointers/Non-Default Constructors.

2-) How should we split the serialization between the class' serialize member versus load/save_construct_data?

My observations show that when un/serializing objects directly like shown above, load/save_construct_data aren't needed, so the serialize member has to handle everything.  When serializing a vector<X>, load/save_construct_data does get called, so we have to un/serialize some members in those functions as well.  At first glance, it seems some members will have to be un/serialized for the second time within load/save_construct_data.

Is that correct?  For a class to be correctly un/serializable for all cases, load/save_construct_data must un/serialize members that are already taken care of in the serialize member?
 
Nope.

If his isn't simple, then there is something wrong.  Check the code in test_non_default_ctor .  If it still doesn't give you what you need, ask again.
 
RObert Ramey