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

标签 c++ serialization boost

抱歉交叉发布。在发布到邮件列表 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/

相关文章:

java - 序列化代理

python - django rest 3.1.1 - 具有 "many"属性的一对多序列化器

c++ - 继承重载成员函数指针的非类型模板形参

c++ - 不使用 boost::asio::ip::tcp::socket 调用移动构造函数

c++ - 忽略 C++ 单元测试

C++shared_ptr序列化

c++ - 分配给成员(member) union

c++ - CMake Boost 链接问题

c++ - 嵌套宏中的 BOOST_PP_SEQ_ELEM 和 BOOST_PP_SEQ_ADD ?

c++ - boost mapped_file 或 file_mapping