【发布时间】:2011-05-24 06:30:43
【问题描述】:
是否可以序列化任何 STL 类,包括 std::string?我有一组 std::strings,我正在尝试将它们写入文件并将它们加载回 std::set。
【问题讨论】:
标签: c++ serialization stl
是否可以序列化任何 STL 类,包括 std::string?我有一组 std::strings,我正在尝试将它们写入文件并将它们加载回 std::set。
【问题讨论】:
标签: c++ serialization stl
是的,这是可能的。以boost.serialization 为例。
对于 STL,请阅读 corresponding tutorial section
【讨论】:
#include <boost/serialization/set.hpp>
ar & str; 没有区别 - 在方法内部或函数内部。
text_oarchive 隐式使用的序列化方法,没有示例用户将如何执行此操作。
使用 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
注意
#include <boost/archive/text_iarchive.hpp> 必须在任何其他 boost 序列化包括之前。【讨论】:
如果您只想将 std::set<std::string> 写入文件并将其读回,并且您的项目尚未使用 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);
【讨论】:
看看这个。足够精简
有几个库支持序列化,如 protobuffer、boost:serialization 对我来说太重了。所以我写了这个精简版。
在 STL 中使用 char 代替 bool why
您可以通过 CMake 构建此项目。或者只是将 serialization.h 导入到您的项目中。
如果要检查字节序,请定义 CHECK_ENDIAN=1
检查 testSerialization.cpp
字节序转换。
【讨论】: