1

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"). enter image description here

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 !

Nico
  • 184
  • 10

1 Answers1

0

I post here an answer if some have the same issue and are looking through this forum. Thanks to boost developpers (you may read this issue), the fix is to mark ClassBase as track_always: BOOST_CLASS_TRACKING(ClassBase, boost::serialization::track_always)

Nico
  • 184
  • 10