0

さて、最近ブーストに切り替えて、単純なオブジェクトまたは単純なクラスのシリアル化を部分的に理解しています(ブーストチュートリアルは私を混乱させます)が、クラスメンバーを含む3D配列をシリアル化するにはどうすればよいですか?

TileListという配列(std :: vector)があります。これには、クラスTileのオブジェクトが含まれ、クラスTileにはintTileIDとintTilePassabilityの2つの変数しか含まれていません。

シリアル化のチュートリアルが目立たない方法とSTLコンテナの方法で行うように試してみましたが、エラーのスタックが返されます。誰かがそれを正しく行う方法を説明できますか?ありがとうございました。

4

1 に答える 1

2

だから私はあなたがこのようなものを持っていることを理解しています(それは実際には3D配列ではありません、私があなたを読み間違えた場合はシリアル化したい正確なコードを投稿してください):

struct Tile {
    int id, passability;
};

std::vector<Tile> tileList;

std::vectorはすでに標準のBoost.Serialization機能を介してシリアル化できるため、シリアル化可能にするだけで済みますTileserialize最も簡単な方法は、ロードと保存の両方を行うメンバーを追加することです。

struct Tile {
   int id, passability;

   template <typename Archive>
   void serialize(Archive& ar, const unsigned version) {
       ar & id;
       ar & passability;
   }
};

これで、タイプはシリアル化可能になりました。考慮すべき特別なことには、クラスメンバーがプライベートであることが含まれます—この場合、Boost.Serializationのフレンド宣言を追加する必要があります。

class Tile {
    int id, passability;
    friend class boost::serialization::access;

    template <typename Archive>
    void serialize(Archive& ar, const unsigned version) {
        ar & id;
        ar & passability;
    }
public:
    Tile(int, int);
};

serializeメンバーはテンプレートである必要があります(実際にはそうではありませんが、ライブラリを少しよく理解するまでは、そうする必要があります)。したがって、その本体全体をクラス宣言に含める必要があります(明示的なインスタンス化を使用しない限り、そうではありません)。初心者のための何か)。

saveメンバーに分割することもできますがload、バージョン管理を開始するまでは役に立ちません。次のようになります。

struct Tile {
    int id, passability;

    BOOST_SERIALIZATION_SPLIT_MEMBER()
    template <typename Archive>
    void save(Archive& ar, const unsigned version) { ... }
    template <typename Archive>
    void load(Archive& ar, const unsigned version) { ... }
};

これにより、ベクトルが保持する型がシリアル化可能になります。ベクトル自体のシリアル化はただのことarchive & tileListです。

于 2011-05-21T21:14:12.950 に答える