1

いくつかのメッセージ構造体があります。それぞれを文字列にシリアライズしたり、文字列からデシリアライズしたりできます。シリアル化の部分では、オーバーロード演算子 << を使用します。しかし、逆シリアル化の部分については、適切な方法が思いつきません。そのため、クラスを使用して文字列を解析します。最近、ブーストの連載に出会いました。それがこの目的に役立つかどうか、またはより良いアイデアがあるかどうかはわかりません。

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;

と仮定gnewgて、あなたの構造体です。

binary_archive次に、スペースを節約したり、読みやすさを節約したりするために、またはその他に変更することもできますtext_archive

編集:あなたの編集のために、ブーストシリアル化はあなたのために逆シリアル化を処理します。アーカイブにシリアル化する限り、そのアーカイブとは逆の方法でアーカイブの作成元のタイプを実行する必要があります。ブーストすると、すべてが適切な場所に戻されます。

私はブーストのNVPとXMLに精通していないので、それが異なる場合は申し訳ありません。

于 2013-01-21T03:19:17.940 に答える
0

boost :: serialization(私が覚えている限り)は、バイナリ、テキスト、XMLなどのいくつかの表現をサポートしています。そして、他のものとの間でシリアル化するためにそれを拡張することは難しくありません(AFAIK)(たとえば、JSON(おそらくそれはすでに行われています、私は知りません))。

車輪の再発明をしたい場合は、boost :: serializationの設計原則に従うことができます-単純化された方法で(比較的)簡単に再実装できます(リンクされたオブジェクトのサポートなし、ほとんどの場合は必要ありません)ケース)。しかし、あなたのコードを見ると、あなた自身のシリアル化よりも他の(すでにテストされた)smthを使用する方が良いと思います...

申し訳ありませんが、あなたのデザインは決して良いものではありません...

于 2013-01-21T03:18:01.127 に答える