C++ 结构序列化

C++ 结构序列化,c++,serialization,C++,Serialization,有一些消息结构。每个都可以序列化为字符串,也可以从字符串反序列化。 对于序列化部分,我使用重载操作符boost::serialization(据我所知)支持很少的表示:二进制、文本和XML。而且(AFAIK)扩展它来序列化其他任何东西(例如JSON(可能已经完成了,我不知道))也不难 如果你想重新发明轮子,你可以遵循boost::serialization的设计原则——很明显,以一种简化的方式(不支持链接对象,这在大多数情况下是不需要的)重新实现是非常容易的。但是看看你的代码,我认为你最好使用s

有一些消息结构。每个都可以序列化为字符串,也可以从字符串反序列化。 对于序列化部分,我使用重载操作符boost::serialization(据我所知)支持很少的表示:二进制、文本和XML。而且(AFAIK)扩展它来序列化其他任何东西(例如JSON(可能已经完成了,我不知道))也不难

如果你想重新发明轮子,你可以遵循boost::serialization的设计原则——很明显,以一种简化的方式(不支持链接对象,这在大多数情况下是不需要的)重新实现是非常容易的。但是看看你的代码,我认为你最好使用smth或者其他(已经测试过的)而不是你自己的序列化

很抱歉,您的设计远远不够好…

boost::serialization(据我所知)支持的表示形式很少:二进制、文本和XML。而且(AFAIK)扩展它来序列化其他任何东西(例如JSON(可能已经完成了,我不知道))也不难

如果你想重新发明轮子,你可以遵循boost::serialization的设计原则——很明显,以一种简化的方式(不支持链接对象,这在大多数情况下是不需要的)重新实现是非常容易的。但是看看你的代码,我认为你最好使用smth或者其他(已经测试过的)而不是你自己的序列化


很抱歉,您的设计远远不够好…

请使用Boost序列化:

有了这个图书馆,你的一切都会得到很好的照顾。例如,您可以将此函数添加到结构中:

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;
假设
g
newg
是您的结构

然后,您还可以更改为
binary\u archive
或其他以节省空间,或
text\u archive
以节省可读性

编辑:对于您的编辑,boost序列化将为您处理反序列化。只要您序列化到一个归档文件,您只需执行与该归档文件相反的操作即可创建归档文件,boost会将所有内容放回正确的位置


我不熟悉boost中的NVP和XML内容,因此,如果与之不同,我很抱歉

使用Boost序列化:

有了这个图书馆,你的一切都会得到很好的照顾。例如,您可以将此函数添加到结构中:

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;
假设
g
newg
是您的结构

然后,您还可以更改为
binary\u archive
或其他以节省空间,或
text\u archive
以节省可读性

编辑:对于您的编辑,boost序列化将为您处理反序列化。只要您序列化到一个归档文件,您只需执行与该归档文件相反的操作即可创建归档文件,boost会将所有内容放回正确的位置


我不熟悉boost中的NVP和XML内容,因此,如果与之不同,我很抱歉

反序列化要执行什么操作?如果给定字符串“{field1=1 | field2=2 | field3=1 | field4=abc}”,则可以将其反序列化为结构s。“字符串”是人类可读的吗?是的。实际上,字符串只是调用“cout boost serialize”的输出,不会使其成为人类可读的字符串,我相信它只是将字段的二进制文件填充到线路上。快速编辑:它有一个返回字符串版本的函数。要反序列化怎么办?字符串“{field1=1 | field2=2 | field3=1 | field4=abc}”,则可以将其反序列化为结构s。该“字符串”是否可读?是。实际上,字符串只是调用的输出“cout boost serialize不会让它成为一个人类可读的字符串,我相信它只是将字段的二进制文件塞进了电线上。快速编辑:它有一个返回字符串版本的函数。同意--“永不重新发明轮子”是一项重要的编程原则。同意--“永不重新发明轮子”是一项重要的编程原则
boost::archive::text_iarchive ia(ifs);
    // read class state from archive
    ia >> newg;