vector(反)序列化与Boost.serialization的向后兼容性

Backwards compatibility of vector (de)serialization with Boost.serialization

本文关键字:serialization 兼容性 Boost 序列化 vector      更新时间:2023-10-16

不好意思。在向邮件列表boost-users发布了一个星期没有任何回应之后,我倾向于在stackoverflow上发布这个问题。原帖,稍作编辑:

嗨列表,

我正在从Boost v1.35迁移到一个新版本。然而,我有一些我希望新版本可读的遗留序列化字符串。

经过一些测试,我发现显然较新的版本(在这个案例1.40(以及以后的版本)不能正确地反序列化来自1.35的std::vector实例生成的字符串。谁能给我指点一下可能是什么这里的问题吗?

非常感谢!

埃瓦尔德

= = = =

细节

我使用的是文本存档,和gcc版本4.4.1 (Ubuntu 4.4.1-4ubuntu9)

测试向量是一个包含2个元素的结构体,即长整数1和2。

对应库版本的存档字符串:

1.35: archive: 22 serialization::archive 4 2 1 2
1.40: archive: 22 serialization::archive 5 2 0 1 2

:

// includes
#include <boost/serialization/vector.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
std::vector<long> testvector;
std::string val = "22 serialization::archive 4 2 1 2"; // v1.35 archive
{
std::stringstream ss(std::stringstream::in | std::stringstream::out);
ss << val << std::endl;
boost::archive::text_iarchive ia(ss);
ia >> BOOST_SERIALIZATION_NVP(testvector);
}

使用lib v1.40执行时的结果:testvector包含两个元素,{2, 2}——代替{1, 2}

注意:s11n和de-s11n使用相同的lib版本工作完美

至少在Boost 1.48中有一个文件boost/serialization/vector_135.hpp有这样的注释:

vector_135.hpp:序列化STL矢量模板以与1.35版本兼容,该版本有一个错误

我认为你可以包括它而不是boost/serialization/vector.hpp。当然,缺点是,在这种情况下,新序列化的向量也将采用这种有缺陷的格式。

编辑:

对代码的简要研究表明,如果使用该文件,load()将能够反序列化两种格式,但save()将以新格式进行序列化。所以,唯一的缺点似乎是丑陋的include name。