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").
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.
Thanks a lot for your help. And if any clarification is needed, I'm available of course !