有一些消息结构。每个都可以序列化为字符串并从字符串反序列化。 对于序列化部分,我使用重载运算符<<。但对于反序列化部分,我想不出一个正确的方法。所以我用一个类来解析字符串。最近,我遇到了boost序列化。我不知道它是否能达到这个目的,还是有更好的主意。
struct S
{
int32_t type;
double a;
int32_t b;
bool c;
std::string d;
friend std::ostream& operator<< (std::ostream& os, const S& s)
{
os << "{field1" << "=" << s.a << "|";
os << "field2" << "=" << s.b << "|";
os << "field3" << "=" << s.c << "|";
os << "field4" << "=" << s.d << "}";
return os;
}
};
编辑:所以,我选择使用xml存档。但是,我有另一个问题。由于有几种类型的消息由字段msgtype分类。反序列化时,如何指定要反序列化的对象?我是否需要手动搜索msgtype字段?
template <typename Archive>
void serialize(Archive &ar, const unsigned int version)
{
using boost::serialization::make_nvp;
ar & make_nvp("msgtype", type);
ar & make_nvp("field1", a);
ar & make_nvp("field2", b);
ar & make_nvp("field3", c);
ar & make_nvp("field4", d);
}
答案 0 :(得分:1)
使用Boost序列化:
http://www.boost.org/doc/libs/1_52_0/libs/serialization/doc/index.html
使用这个库,它几乎可以为您提供一切照顾。例如,您可以将此函数添加到结构中:
void serialize(Archive & ar, const unsigned int version)
{
ar & a;
ar & b;
ar & c;
ar & d;
}
然后,您将能够通过执行以下操作来序列化和反序列化:
boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa << g;
和此:
boost::archive::text_iarchive ia(ifs);
// read class state from archive
ia >> newg;
假设g
和newg
是您的结构。
您也可以更改为binary_archive
或其他以节省空间,或text_archive
以节省可读性。
编辑:对于您的编辑,boost序列化将为您处理序列化。只要您序列化到一个存档,您只需要从该存档执行与存档创建类型相反的操作,并且boost会将所有内容放回正确的位置。
我不熟悉增强中的NVP和XML内容,所以如果它不同于我很抱歉。
答案 1 :(得分:0)
boost :: serialization(据我记得)支持很少的表示:二进制,文本和XML。并且将它扩展到序列化到/从其他任何东西(例如JSON(可能它已经完成,我不知道))并不难(AFAIK)。
如果您想重新发明轮子,您可以遵循boost :: serialization的设计原则 - 它非常清晰(相对)易于以简化方式重新实现(不支持链接对象,这不是大多数情况下都需要)。但是看看你的代码,我认为你最好使用smth else(已经测试过)而不是你自己的序列化......
很抱歉,但你的设计远远不够......