2009-03-20 11 views
6

私はBoost.Serializationを使用してクラスのコンテンツをアーカイブしています。メンバ変数の1つは静的なstd :: vectorです。静的メンバーとブーストシリアル化

アーカイブと復元はうまくいっていますが、ライブラリが静的メンバーを一度保存​​することを望んでいました。ファイルサイズで判断すると、静的メンバーはアーカイブされたインスタンスごとに完全に保存されています。

これは、静的ベクトルにset/gettersを使用し、クラス外で静的ベクトルを一度シリアル化することで、簡単に回避できます。

しかし、私はむしろ自己完結型のクラスを持っています。クラスの静的コンテンツを1回だけアーカイブするのは、きれいで簡単な方法ですか?

答えて

2

すべてのクラスのインスタンスをシリアル化する前に静的ベクトルをシリアル化します。あなたはこのようなベクターをシリアライズする場合

は:

template<class Archive> 
void serialize(Archive & ar, const unsigned int version) 
{ 
    ar & this->someVar; 
    ar & this->AnotherVar; 
    ar & staticVector; 
} 

すると確かに、静止ベクトルは、各インスタンスでシリアル化され得るん。

さらに詳しい説明が必要な場合は、serialize関数とそれを呼び出す関数を投稿してください。

+1

私はそれが正直であると確信しているとは思わない。静的インスタンスはすべてのクラスインスタンスの同じメモリアドレスに存在するので、ライブラリを何らかの形で選択し、ファイルを書き込むたびにベクトルを書き込まないように十分にスマートになることを期待していました。 – Pieter

+0

最初にベクトルをシリアライズし、次にすべてのインスタンスを '簡単に回避している'と言っていましたが、自分のクラスにserialize()が含まれていると言っていましたが... 最初にベクトルをシリアライズすることは私が当然のことです(これは今のところ動作しています...) – Pieter

+0

ブーストはメモリの場所にかかわらず、シリアライズするように指示するものをシリアル化します。 。 静的セクションはどこに保存されますか?最初、最後、途中で? 「シリアル化」のようなフラグを使用する方法もあります。 – arul

1

私はBoost.Serializationと非常に限られた経験を持っているので、それに応じて以下のものを検討してください:

IIRC、あなたの静的メンバに必要治療がポインタで行われているものです。だから、静的メンバーへのポインタをシリアル化することができます。

自己批評:デシリアライズ時にどのように適用できるかわかりません。

関連する問題