Skip to content

Boost serialization (bug?) issue with MSVC, with vector<shared_ptr> in several libraries #183

Description

@gri38

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: 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").
image

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".

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 !

N.B.: I compiled with the last development version of boost serialization, the issue remains.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions