【问题标题】:Serialization of STL ClassSTL类的序列化
【发布时间】:2011-05-24 06:30:43
【问题描述】:

是否可以序列化任何 STL 类,包括 std::string?我有一组 std::strings,我正在尝试将它们写入文件并将它们加载回 std::set。

【问题讨论】:

    标签: c++ serialization stl


    【解决方案1】:

    是的,这是可能的。以boost.serialization 为例。

    对于 STL,请阅读 corresponding tutorial section

    【讨论】:

    • 我可以用字符串做,例如可以直接用 set 做吗?
    • @cpx: #include <boost/serialization/set.hpp>
    • 他不想要一个使用 STL 容器创建类的示例,他想要一个获取 STL 容器并将其放入文件的函数示例。
    • @Elazar Leibovich:在哪里写 ar & str; 没有区别 - 在方法内部或函数内部。
    • 也许可以更改示例以按用户要求工作,但目前不能。 (Archive 中应该有什么类?你如何使用它?示例显示了text_oarchive 隐式使用的序列化方法,没有示例用户将如何执行此操作。
    【解决方案2】:

    使用 boost::serialization 序列化 STL 类型的示例

    #include <map>
    #include <fstream>
    #include <boost/archive/text_iarchive.hpp>
    #include <boost/archive/text_oarchive.hpp>
    
    #include <boost/serialization/map.hpp>
    
    int main(int argc,char** argv) {
      std::ofstream s("tmp.oarchive");
      boost::archive::text_oarchive oa(s);
      std::map<int,int> m;
      m[1] = 100;
      m[2] = 200;
      oa << m;
    }
    

    编译

    g++ -lboost_serialization myfile.cc
    

    注意

    1. #include &lt;boost/archive/text_iarchive.hpp&gt; 必须在任何其他 boost 序列化包括之前。
    2. 您需要包含要归档的 STL 类型的标头。

    【讨论】:

      【解决方案3】:

      如果您只想将 std::set&lt;std::string&gt; 写入文件并将其读回,并且您的项目尚未使用 Boost,您可以尝试一些简单的方法:

      ofstream file("file.txt");
      copy(theSet.begin, theSet.end(), ostream_iterator<string>(file, "\n"));
      

      这将简单地将字符串(每行一个)写入文本文件。然后阅读它们:

      ifstream file("file.txt");
      string line;
      while(getline(file, line))
          theSet.insert(line);
      

      【讨论】:

      • 当然,如果字符串包含换行符,这将不起作用。不过,我愿意打赌 OP 不会。
      • 为什么不用空字符来分隔它们呢? C 字符串通常不包含这些。
      • 因为这会使输出文件更难被人类阅读。
      • 什么时候默默无闻好?如果用户可以在再次加载之前编辑写出的文件,那就太好了。他们不应该知道一些神奇的“晦涩的 unicode 换行符”来做到这一点。晦涩难懂。简单就好。
      • @JohnZwinck 要停止 0xA aka '\n' 的问题,您可以使用 0x1 - 0x1F 中的另一个数字,它可以为您提供所需的功能。例如:0x1E,它是一个记录分隔符。
      【解决方案4】:

      看看这个。足够精简

      STL serialization

      只需要一个 CPP 文件

      一种精简的序列化解决方案

      有几个库支持序列化,如 protobuffer、boost:serialization 对我来说太重了。所以我写了这个精简版。

      支持

      • 矢量
      • 地图
      • 设置
      • 字符串
      • 基元(int,double,long,...)
      • 字节序支持
      • 嵌套容器支持

      在 STL 中使用 char 代替 bool why

      构建

      您可以通过 CMake 构建此项目。或者只是将 serialization.h 导入到您的项目中。

      如果要检查字节序,请定义 CHECK_ENDIAN=1

      演示

      检查 testSerialization.cpp

      即将推出

      字节序转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-12
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 2015-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多