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

6

抱歉发帖重复了。在发到 Boost 用户邮件列表后一个星期没有任何回复后,我倾向于在 Stack Overflow 上发帖。

大家好,

我正在从 Boost v1.35 迁移到新版本。但是,我有一些旧的序列化字符串,我希望新版本能够读取这些字符串。

经过一些测试,我发现新版本(这里是 1.40,但也包括以后的版本)似乎无法正确反序列化从 1.35 生成的 std::vector 实例。有人能给我指点一下问题出在哪里吗?

非常感谢!

Ewald

==详情==

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

测试向量是一个包含两个长整数 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完美运行。
1个回答

1

Boost 1.48 中至少有一个文件 boost/serialization/vector_135.hpp,其中包含以下注释:

vector_135.hpp:序列化 stl vector 模板以与版本 1.35 兼容,该版本存在错误

我认为您可以将其包含,而不是 boost/serialization/vector.hpp。当然,缺点是在这种情况下,新序列化的向量也将处于那种有缺陷的格式中。

编辑:

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


刚刚尝试了Boost 1.47,结果向量仍然是{2, 2}。这与此票证#2271的一些内容相符。 - Ewald KeinNachname
问题在于,即使包含了vector_135.hpp,也没有任何区别,因为适当的加载方法没有被调用 - 我也不太愿意依赖某种补丁。 - Ewald KeinNachname
在Boost 1.48.0的vector_135.h中,明确指出1.35与1.36-1.40不兼容。也许这是1.4.0中未记录的错误? - std''OrgnlDave
说实话,我认为你的答案并不像我希望得到的那样完整,但既然这是唯一的答案,我还是会授予你赏金。感谢你的努力。 - George Skoptsov
@GeorgeSkoptsov:公平地说,我对这个特定的问题一无所知,只是了解了Boost.Serialization并研究了一下代码,找到了这个头文件。如果不太起作用,那就算了... ;) - user319799

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接