gpt4 book ai didi

c++ - 结构序列化

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:13 25 4
gpt4 key购买 nike

有一些消息结构。每个都可以序列化为字符串并从字符串反序列化。对于序列化部分,我使用重载运算符 <<。但是对于反序列化部分,我想不出合适的方法。所以我使用一个类来解析字符串。最近,我遇到了升压序列化。我不知道它是否可以达到这个目的,或者有更好的主意。

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);
}

最佳答案

使用 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;

假设 gnewg 是您的结构。

然后您还可以更改为 binary_archive 或其他以节省空间,或更改为 text_archive 以保持可读性。

编辑:对于您的编辑,提升序列化将为您处理反序列化。只要你序列化到一个文件,你只需要从那个文件到创建文件的类型做相反的事情,boost 就会把所有东西放回正确的地方。

我不熟悉 boost 中的 NVP 和 XML 内容,所以如果它与我不同,我很抱歉。

关于c++ - 结构序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14431961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com