TLDR:クラスのシリアル化を実装レベルobject_class_info
からobject_serializable
に移行し、古いデータファイルとの互換性を保ちながら、常に新しいフォーマットでファイルを書きたいと思います。ブーストシリアル化:バージョン化されたクラスからobject_serializableへの移行
理由:ブーストシリアライゼーションライブラリを使用し始めたとき、私には既にをシリアル化するためのヘッダ(complex.hpp)が付いていたことに気づいていませんでした。代わりに、私は私自身、自立シリアライズ機能を書いた:デフォルトで
namespace boost { namespace serialization {
template<class Archive, typename T>
void serialize(Archive& ar, std::complex<T>& comp, const unsigned int version) {
ar & reinterpret_cast<T(&)[2]>(comp)[0];
ar & reinterpret_cast<T(&)[2]>(comp)[1];
}
}
これはかなりダウンコードを遅くバージョンとクラス情報の追跡を可能に。 Boostに付属しているシリアライゼーション機能はかなり高速です。
新しいデータファイルを書き出すときに常にBoostバージョンを使用するように移行したいが、それでも古いデータファイルを読み込めるようにする。古いバイナリで新しいファイルを読むことは問題ではありません。
問題は、新しいシリアル化がバージョン管理されていないことです(明らかに)。さらに、古いバージョンのコードを使ってアーカイブを読み込み、直ちに新しいバージョンを使用して書き直そうとすることもできません。デシリアライズ/シリアライゼーションの特性はグローバルプロパティです。
a)常に新しいファイルを書き込んだりしながら古いファイルと新しいファイルを透過的に読み取るか、b)古いファイルを読み込んですぐに新しいフォーマットで書き出すかのいずれかを行うにはどうすればよいでしょうか?
を設定することができ、「古いバイナリと新しいファイルで読むことは問題ではない」 - ことを何をしますかmean – sehe
@sehe:新しいコードからコンパイルされた新しいバイナリを使って古いデータファイルを読みたい。以前のバージョンのコードから既存のバイナリを使用して新しいデータファイルを読み込むことは望ましくありません。 – Claudius