Boost logo

Boost :

From: Nicolas Guillot (nicolas.guillot_at_[hidden])
Date: 2019-11-21 16:51:47


We use boost serialization in ours projects, both on linux (gcc) and
Windows.

We encounter a problem only on Windows (for "every" versions of Windows (7
and 10) and of MSVC: Visual 2010 and 2015, ie. MSVC++ 10.0 _MSC_VER == 1600
or MSVC++ 14.0 _MSC_VER == 1900).

*Here is the problem summarized*, but I need to give more details after:
When I serialize a class

   - which have base class
   - and have 2 vector of shared_ptr of ClassB, with the same contents, and
   B inherits from the same base class

the serialization works, but the deserialization doesn't ("input stream
error").

The following image is here : https://i.stack.imgur.com/osoiF.png (if it's
not displayed)

[image: enter image description here] <https://i.stack.imgur.com/osoiF.png>

Yes, it's very strange:

   - if I remove the base class, it works.
   - if I inline the serialization code (empty function) of the base class,
   it works.
   - if the 2 vectors don't have the same content, it works !!
   -

   if I register the ClassBase in the serialize method of ClassTest, it
   works. I.e.:

   // in ClassTest:template <class Archive>void serialize(Archive &
ar, const unsigned int version) {
       ar.template register_type<ClassBase>();
       ...}

*Some details*

*When it works* on linux, and when it works on Windows with ClassBase type
registration in the archive, we have the same xml output.
It's worth noting that:

   - boost_serialization is version 17 on Windows and 9 on linux (I didn't
   tried to update boost on linux yet).
   - On BaseClass xml tag, the tracking_level="1", so we have object_id.

*And when it doesn't work* (once again: the serialization of ClassTest is
OK, but cannot deserialized "input stream error"):

   - The main difference is in the serialization of ClassTest: the
   ClassBase part has no tracking_level.
   - However it's not the only cause, because if the vectors are differents
   (same 2 first items, and a third item in one vector), tracking_level of
   ClassBase in ClassTest part is "0".

Last thing, if it can give you some clues: while we debugged our
application, we noticed that the deserialization framework tries to
deserialize a class into another.
It makes me think the serialization framework is confused about the classe
types identifications.
Could it be a matter of dll linking? Of global static shared storage ?

I've posted a visual studio solution here
<https://1drv.ms/u/s!Aoy4ax0S3ZS5gkxv1UIvRUd32oVO?e=ACVi4c>.

Thanks a lot for your help. And if any clarification is needed, I'm
available of course !


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk