代码之家  ›  专栏  ›  技术社区  ›  Jan Deinhard

做Boost.序列化在不同的平台上进行不同的序列化?

  •  12
  • Jan Deinhard  · 技术社区  · 15 年前

    我用Boost.序列化序列化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上序列化地图时,我无法在Ubuntu框上反序列化它。我收到一封信 无效的签名 如果我尝试的话会有例外。

    4 回复  |  直到 15 年前
        1
  •  16
  •   Sam Miller    15 年前

    尝试使用 text_iarchive text_oarchive 而不是二进制文件。从 documentation

    在本教程中,我们使用了 特定存档类- 要加载的文本文件。文本 归档文件将数据呈现为文本,并且 可跨平台移动。此外 对于文本档案,图书馆包括 以及xml格式的数据。接口 所有存档类都是相同的。 一旦定义了序列化 对于一个类来说,这个类可以是 序列化到任何类型的存档。

        2
  •  9
  •   Daniel    15 年前



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

        3
  •  7
  •   kizzx2    15 年前

    文本存档的性能比二进制存档慢很多。如果你喜欢表演,你可以试一试 an unofficial portable binary archive eos_portable_archive . 我用它在Windows上成功地序列化了32位和64位的数据。你可以试一试。

    只需将文件放入序列化目录。那里的文件不是最新的boost版本(1.44.0)的最新版本,但是您只需要做2个非常简单的调整就可以工作了(您的编译器会告诉您非常明显的错误消息)。

        4
  •  3
  •   T.E.D.    15 年前

    二进制格式 ASN.1 .

    XML允许处理同样的问题,但通常是在文本中。XML有一个背驮式标准,叫做 Fast Infoset 这允许XML以二进制形式编码数据,但它使用ASN.1。

    推荐文章