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框中反序列化它.如果我尝试,我会收到无效的签名异常.
boost:archive :: binary_xarchive目前不可移植
我的解释意味着不同平台上可能存在差异.文本存档在所有系统上为您提供相同的输入/输出行为.
还有一个相关的TODO条目,它试图解决二进制存档的可移植性问题:TODO Entry
text_archives的性能比binary_archive慢.如果性能是你的事情,你可以尝试一个非官方的便携式二进制存档 eos_portable_archive
.我已经用它来成功地在Windows上对32位和64位的数据进行序列化.你可以试一试.
只需将文件放在序列化目录中即可.这里的文件与最新的升级版本(1.44.0)不是最新的,但你只需进行2次非常简单的调整就可以使它工作(你的编译器会告诉你非常明显的错误信息).
归档时间: |
|
查看次数: |
6924 次 |
最近记录: |