我有一个C STL映射,它是int和customType的映射 . customType是一个结构,它有字符串和字符串列表,如何将其序列化为文件 .
示例结构:
struct customType{ string; string; int; list<string>; }
如果您不怕BOOST,请尝试BOOST Serialize :(模板代码,这里可能有些错误...)
#include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/serialization/map.hpp> #include <boost/serialization/string.hpp> #include <boost/serialization/list.hpp> struct customType{ string string1; string string2; int i; list<string> list; // boost serialize private: friend class boost::serialization::access; template <typename Archive> void serialize(Archive &ar, const unsigned int version) { ar & string1; ar & string2; ar & i; ar & list; } }; template <typename ClassTo> int Save(const string fname, const ClassTo &c) { ofstream f(fname.c_str(), ios::binary); if (f.fail()) return -1; boost::archive::binary_oarchive oa(f); oa << c; return 0; }
用法:
Save< map<int, customType> >("test.map", yourMap);
一个简单的解决方案是在一行上输出每个成员,包括列表中的所有字符串 . 每条记录都以 Map 的键开头,并以不在列表中的特殊字符或字符序列结束 . 通过这种方式,您可以一次读取一行,并知道第一行是 Map 键,第二行是结构中的第一个字符串,依此类推,当您到达特殊记录结束序列时,您知道列表已完成这是 Map 中下一个项目的时间 . 此方案使文件生成可读,如果您需要在程序外编辑它们,则可编辑 .
如果你问这个,那么你可能已经知道你不能通过以下方式序列化:
file.write( (const char *) &mapOfCustom, sizeof( mapOfCustom ) );
问题与复杂对象有关(在C中,即使是字符串变量也是一个复杂的对象),即那些不是自包含的对象 . 实际上,即使是简单的序列化也存在问题,其范围从平台兼容性到甚至编译器兼容性(不同的填充等) .
一种方法是使用一个简单的XML库,如tinyXML:
http://www.grinninglizard.com/tinyxml/
并将保存写入XML,并从XML过程中恢复 .
C没有像Java和其他人那样的反射功能,因此没有“自动”方式 . 您必须自己完成所有工作:打开文件,在循环中输出每个元素,然后关闭文件 . 此外,文件没有标准格式,您需要定义一个满足您需求的格式 . 当然,有些图书馆可以提供帮助,但它们不是语言的一部分 . 看看这个问题:
Is it possible to automatically serialize a C++ object?
另请看一下:http://s11n.net/
你可以试试这个:cxx-prettyprint
5 回答
如果您不怕BOOST,请尝试BOOST Serialize :(模板代码,这里可能有些错误...)
用法:
一个简单的解决方案是在一行上输出每个成员,包括列表中的所有字符串 . 每条记录都以 Map 的键开头,并以不在列表中的特殊字符或字符序列结束 . 通过这种方式,您可以一次读取一行,并知道第一行是 Map 键,第二行是结构中的第一个字符串,依此类推,当您到达特殊记录结束序列时,您知道列表已完成这是 Map 中下一个项目的时间 . 此方案使文件生成可读,如果您需要在程序外编辑它们,则可编辑 .
如果你问这个,那么你可能已经知道你不能通过以下方式序列化:
问题与复杂对象有关(在C中,即使是字符串变量也是一个复杂的对象),即那些不是自包含的对象 . 实际上,即使是简单的序列化也存在问题,其范围从平台兼容性到甚至编译器兼容性(不同的填充等) .
一种方法是使用一个简单的XML库,如tinyXML:
http://www.grinninglizard.com/tinyxml/
并将保存写入XML,并从XML过程中恢复 .
C没有像Java和其他人那样的反射功能,因此没有“自动”方式 . 您必须自己完成所有工作:打开文件,在循环中输出每个元素,然后关闭文件 . 此外,文件没有标准格式,您需要定义一个满足您需求的格式 . 当然,有些图书馆可以提供帮助,但它们不是语言的一部分 . 看看这个问题:
Is it possible to automatically serialize a C++ object?
另请看一下:http://s11n.net/
你可以试试这个:cxx-prettyprint