Hi Robert,
On Sat, Sep 24, 2011 at 10:08 AM, Robert Ramey wrote:
Current, serializing quantitysi::length q produces:
<q class_id="0" tracking_level="1" version="0" object_id="_0">
<value>5</value>
</q>
Which doesn't give any information about the quantity at hand, not
even for the human reading it. So, I tried to use
BOOST_CLASS_EXPORT_GUID to register a name for the serialized class,
but it is ignored.
This is a feature of the xml_?archive implementation. In general, the
archive
implementations include the minimum information required to re-constitute
the original data - and no more.
Ah! that may also explain why in all the examples I see of
BOOST_CLASS_EXPORT, it only worked (saved a string with the name of
the class) for derived classes saves from their base class.
Good. Having settled on that, I think it would be cool to have the
*option* to save the class name (or other tag information) with the
object. Just a suggestion for Boost.Serialization.XML
I think of the quantity example because all quantities saved to
xml_archive look exactly the same regardless of whether they are the
same dimension or not, so it exists the possibility that
quantitysi::length is saved, but then read as quantitysi::time.
Now about a workaround from the point of view of Boost.Units, suppose
I want to ensure that additional information (spurious for
reconstruction but useful as a check and human reader) with the
current implementation. Currently the serialization of
boost.unit.quantity is:
// boost/units/io.hpp
template
inline void serialize(Archive& ar,boost::units::quantity&
q,const unsigned int /*version*/){
ar & boost::serialization::make_nvp("value", q.value); //basically
this in the code
}
if changed to
template
inline void serialize(Archive& ar,boost::units::quantity&
q,const unsigned int /*version*/){
ar & boost::serialization::make_nvp("value", q.value); //basically
this in the code
#ifdef BOOST_UNIT_SERIALIZATION_ADD_INFO
std::string unit_info = boost::to_string(Unit());
ar & boost::serialization::make_nvp("unit", unit_info );
#ifdef BOOST_UNIT_SERIALIZATION_CHECK_INFO
assert( unit_info == boost::to_string(Unit()); // or throw
SOMETHING (see below)?
#endif
#endif
}
then I expect the output to be:
<q class_id="0" tracking_level="1" version="0" object_id="_0">
<value>5</value>
<unit>m</unit>
</q>
Which provides information to the human and and also can be used do a
basic check at reading the archive. The logic would be that nobody
ever will want to read a saved quantity of a given system and
dimension as another quantity in anothe system or dimension. In this
case this is a suggestion for the Boost.Units serialization
implementation. If double check is not desired the human can still
benefit, as it can if the tag had the following info <q unit = "m"
class_id="0" tracking_level="1" version="0" object_id="_0">
BTW, Robert, what would be the canonical exception to throw from the
assert line in the proposed code (which I plan to implement
internally)? something that can by useful for the error handling of
boost.serialization?
(I now understand that boost.serialization was not designed with this
in mind, but I need to do something like this to add this little piece
of information to the xml.)
Thanks,
Alfredo