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

Ewa*_*ame 6 c++ serialization boost

抱歉交叉发布.发布到邮件列表boost-users后一周没有任何回复我倾向于在stackoverflow发布问题.原帖,稍加重新编辑:

嗨列表,

我正在从Boost v1.35迁移到新版本.但是,我有一些遗留的序列化字符串,我想让新版本可读.

经过一些测试后,我发现显然较新的版本(在本例中为1.40但后来)无法从1.35生成的字符串中正确反序列化std :: vector实例.任何人都可以指出我的问题可能是什么问题吗?

非常感谢!

埃瓦尔德

== ==详细

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

测试向量是具有2个项的结构,长整数1和2.

各个lib版本的归档字符串:

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);
}
Run Code Online (Sandbox Code Playgroud)

使用lib v1.40执行时的结果:testvector包含两个元素 {2, 2}- 而不是{1, 2}

注意:具有相同lib版本的s11n和de-s11n工作正常.

小智 1

boost/serialization/vector_135.hppBoost 1.48 中至少有一个文件带有以下注释:

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

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

编辑:

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