I looked into this it looks as thought the issue is occuring in collections_load_imp.hpp where the library version returned from .get_library_version() does not return a value greater than 3.... or never gets called. So in our case when loading a serialized vector item version is never deserialized even though it is in the incoming message. I also had one of our guys (my laptop died... long story) try calling "set_library_version(unsigned int archive_library_version);" from basic_iarchive on the archive such as ia.set_library_version(4) and I believe this crashed the app with and exception. I will try this workaround once my laptop is back as temporary work around for others until this gets fixed may be a good alternative to a patch. Hopfully a fix will be there by the time my laptop is resurrected.
inline void load_collection(Archive & ar, Container &s)
{
s.clear();
// retrieve number of elements
collection_size_type count;
unsigned int item_version;
ar >> BOOST_SERIALIZATION_NVP(count);
if(3 < ar.get_library_version())
ar >> BOOST_SERIALIZATION_NVP(item_version);
else
item_version = 0;
...
Also of note from basic_iarchive ..
basic_iarchive::get_library_version() const{
return pimpl->m_archive_library_version;
}
m_archive_library_version is set in the constructor of basic_iarchive_impl ..
basic_iarchive_impl(unsigned int flags) :
m_archive_library_version(ARCHIVE_VERSION()),
where ARCHIVE_VERSION is defined in basic_archive.cpp to to be 4
ARCHIVE_VERSION(){
return 4;
}
That's about all I know about the issue. I am curious to see if calling set_library_version on the archive before deserialization of the archive occurs works for anyone.
Brian.
Johan Råde wrote:Does anyone know if the problem can be fixed by just replacing the file serialization/vector.hpp
> I just ran some tests on Windows, and I can confirm the problem.
> Here is output from serialization of an std::vector<X*>
> where the class X has an empty serialization function.
>
> Boost 1.34.1:
>
> <v class_id="0" tracking_level="0" version="0">
> <count>2</count>
> <item_version>0</item_version>
> <item class_id="1" tracking_level="1" version="0" object_id="_0"></item>
> <item class_id_reference="1" object_id="_1"></item>
> </v>
>
> Boost 1.35:
>
> <v class_id="0" tracking_level="0" version="0">
> <count>2</count>
> <item class_id="1" tracking_level="1" version="0" object_id="_0"></item>
> <item class_id_reference="1" object_id="_1"></item>
> </v>
>
> This is a *major problem* for us, because we will release a new version of our app soon.
> The app has "Export" and "Import" functions that are implemented using Boost.Serialization.
> It is required that files that have been exported with one version of our app
> can be imported with a later version.
>
> Is there a patch for this problem yet?
>
> Thank you,
> Johan Råde
in Boost 1.35 with the Boost 1.34.1 version (but keeping the rest of 1.35)?
--Johan
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users