【问题标题】:struct serialization结构序列化
【发布时间】:2013-01-21 03:06:53
【问题描述】:

有一些消息结构。每个都可以序列化为字符串并从字符串反序列化。 对于序列化部分,我使用重载运算符

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

【问题讨论】:

  • 反序列化要做什么?
  • 给出一个字符串“{field1=1|field2=2|field3=1|field4=abc}”,可以反序列化为struct s。
  • “字符串”人类可读吗?
  • 是的。实际上字符串只是调用“cout 的输出
  • boost serialize 不会使其成为人类可读的字符串,我相信它只会将字段的二进制文件塞到网络上。快速编辑:具有返回字符串版本的功能。

标签: c++ serialization


【解决方案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;

假设 gnewg 是你的结构。

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

编辑:对于您的编辑,boost 序列化将为您处理反序列化。只要您序列化为存档,您只需将该存档与创建存档的类型相反,boost 会将所有内容放回正确的位置。

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

【讨论】:

  • 同意——“永远不要重新发明轮子”是一个重要的编程原则
【解决方案2】:

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

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

抱歉,你的设计还差得很远……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多