Boost.Serialization在不同平台上是否有不同的序列化?

Jan*_*ard 13 c++ serialization boost boost-iostreams boost-serialization

我使用Boost.Serialization来序列化std :: map.代码看起来像这样

void Dictionary::serialize(std::string & buffer)
{
  try {
    std::stringstream ss;
    boost::archive::binary_oarchive archive(ss);
    archive << dict_; 
    buffer = ss.str();
  } catch (const std::exception & ex) {
    throw DictionaryException(ex.what());
  }
}

void Dictionary::deserialize(const char * const data, int length)
{
  try {
    namespace io = boost::iostreams;
    io::array_source source(data, length);
    io::stream<io::array_source> in(source);
    boost::archive::binary_iarchive archive(in);
    archive >> dict_;
  } catch (const std::exception & ex) {
    throw DictionaryException(ex.what());
  }
}
Run Code Online (Sandbox Code Playgroud)

我在Mac Snow Leopard和Ubuntu Lucid 10.04上编译并测试了代码.两个系统都有Boost 1.40.在Mac上我自己构建了代码.在Ubuntu框中,我通过aptitude获得了二进制文件.

问题:当我在Mac上序列化地图时,我无法在Ubuntu框中反序列化它.如果我尝试,我会收到无效的签名异常.

Sam*_*ler 16

尝试使用a text_iarchivetext_oarchive不是二进制存档.从文档中

在本教程中,我们使用了一个特定的归档类 - text_oarchive用于保存,text_iarchive用于加载.文本存档将数据呈现为文本,并且可跨平台移植.除文本存档外,该库还包括本机二进制数据和xml格式数据的存档类.所有归档类的接口都是相同的.为类定义序列化后,可以将该类序列化为任何类型的归档.

  • 请注意,这可能会对应用程序的性能产生非常显着的影响. (5认同)

Dan*_*iel 9

boost:archive :: binary_xarchive目前不可移植

我的解释意味着不同平台上可能存在差异.文本存档在所有系统上为您提供相同的输入/输出行为.
还有一个相关的TODO条目,它试图解决二进制存档的可移植性问题:TODO Entry


kiz*_*zx2 7

text_archives的性能比bina​​ry_archive慢.如果性能是你的事情,你可以尝试一个非官方的便携式二进制存档 eos_portable_archive.我已经用它来成功地在Windows上对32位和64位的数据进行序列化.你可以试一试.

只需将文件放在序列化目录中即可.这里的文件与最新的升级版本(1.44.0)不是最新的,但你只需进行2次非常简单的调整就可以使它工作(你的编译器会告诉你非常明显的错误信息).

  • **更新:**EOS portable archive v5.0现在[支持wstring](http://epa.codeplex.com/releases/view/91073).新家是[这里](http://epa.codeplex.com/). (3认同)