1

私は古い(boost :: serialisation)アーカイブを持っています。これは以下を使用して生成されました:

class Data;
data = new Data();
ar & data;

これで、コードは次のように変更されました。

class Header;
class Data;
header = new Header();
data = new Data();
ar & header;
ar & data;

だから、私の質問:古いアーカイブに新しいコードをロードするにはどうすればよいですか? 私の知る限り、boost :: serialisationはアーカイブのバージョン管理を許可していません。ロードしようとすると、ar & header;保存されたデータを処理しようとするため、「入力ストリームエラー」が発生します。とar & data;

編集:私は知っBOOST_CLASS_VERSION(ns::Class, x)ていますが、これはアーカイブには適用されません。

4

2 に答える 2

2

ブーストシリアル化ではバージョン管理可能です。残念ながら、あなたはこれを知らなかったのでar & header 、クラスバージョンをぶつけずに新しいアーカイブを保存することで下位互換性を壊しました。

上にリンクされたチュートリアルはそれをよく説明しています。あなたの場合、を追加することにしたときheader、あなたは次のようにそれをしなければなりませんでした:

class YourClass
{
    /* ... */

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        if(version > 0)
            ar & header;
        ar & data;
    }
};

BOOST_CLASS_VERSION(YourClass, 1)

最後にのみフィールドを追加する場合でも、シリアル化コードを変更するたびにクラスのバージョンをバンプする必要があります。

于 2012-09-01T08:27:32.273 に答える
0

したがって、古いバージョンのアーカイブ用の変換プログラムを作成する以外に、それを行う方法はないようです。

ただし、現在「ヘッダー」が含まれているので、将来、トップレベルにクラスを追加する必要がある場合は、そのバージョンをバンプして、ロード関数でロジックを使用できます。

于 2012-09-02T13:28:33.030 に答える