|
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