1

有一些消息结构。每个都可以序列化为字符串并从字符串反序列化。对于序列化部分,我使用重载运算符<<。但是对于反序列化部分,我想不出一个合适的方法来做到这一点。所以我使用一个类来解析字符串。最近,我遇到了 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);
  }
4

2 回答 2

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;

假设gandnewg是你的结构。

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

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

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

于 2013-01-21T03:19:17.940 回答
0

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

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

对不起,但你的设计远非好...

于 2013-01-21T03:18:01.127 回答