我使用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());
}
}
我在Mac Snow Leopard和Ubuntu Lucid 10.04上编译并测试了代码。两个系统都有Boost 1.40。在Mac上我自己构建了代码。在Ubuntu框中,我通过aptitude获得了二进制文件。
问题:当我在Mac上序列化地图时,我无法在Ubuntu框中反序列化它。如果我尝试,我会收到无效签名异常。
答案 0 :(得分:16)
尝试使用text_iarchive
和text_oarchive
代替二进制存档。来自documentation
在本教程中,我们使用了一个 特定档案类 - text_oarchive用于保存和 text_iarchive用于加载。文本 档案将数据呈现为文本和 可跨平台移植。此外 文本档案,图书馆包括 本机二进制数据的归档类 和xml格式的数据。接口 所有归档类都是相同的。 一旦定义了序列化 对于一个班级,那个班级可以 序列化为任何类型的档案。
答案 1 :(得分:9)
boost:archive :: binary_xarchive目前不是便携式的
根据我的解释,这意味着不同平台上可能存在差异。文本存档在所有系统上为您提供相同的输入/输出行为。
还有一个相关的TODO条目,它试图解决二进制存档的可移植性问题:TODO Entry
答案 2 :(得分:7)
text_archives的性能比binary_archive慢。如果你的表现很好,你可以尝试an unofficial portable binary archive eos_portable_archive
。我已经用它在Windows上串行化32位和64位数据并成功。你可以试一试。
只需将文件放在序列化目录中即可。这里的文件不是最新的升级版本(1.44.0),但你需要进行2次非常简单的调整才能使其正常工作(编译器会告诉你非常明显的错误信息)。
答案 3 :(得分:3)
我同意答案,但想补充说明。您可能认为这是一个令人讨厌的疏忽,但实际上提出并实现可移植的二进制格式并不是一项微不足道的任务。我所知道的唯一有效解决二进制中问题的标准是ASN.1。
XML pruports解决同样的问题,但通常用文本来解决。有一个称为Fast Infoset的XML搭载标准允许XML以二进制形式对数据进行编码,但它使用ASN.1。