抱歉交叉发布。在发布到邮件列表 boost-users 并且一周没有任何回复后,我倾向于在 stackoverflow 上发布问题。 原始帖子,稍作重新编辑:
嗨名单,
我正在从 Boost v1.35 迁移到新版本。然而,我有一些 我希望新版本可读的遗留序列化字符串。
经过一些测试,我发现显然是较新的版本(在这个 案例 1.40 以及更高版本)无法从 1.35 正确反序列化 std::vector 实例 生成的字符串。谁能给我一个关于可能是什么的指针 问题在这里?
非常感谢!
埃瓦尔德
==详情==
我使用文本存档和 gcc 版本 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
测试 vector 是一个包含 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: serialization for stl vector templates for compatibility with release 1.35, which had a bug
我想您可以包含它而不是 boost/serialization/vector.hpp
。当然,不利的是,在这种情况下,新序列化的 vector 也将采用这种有问题的格式。
编辑:
代码的简要研究表明,如果使用文件,load()
将能够反序列化两种格式,但 save()
将以新格式序列化.因此,唯一的缺点似乎是丑陋的 include 名称。
关于c++ - vector (反)序列化与 Boost.serialization 的向后兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8314202/