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