1

書き込みアクセス権のないクラスをシリアル化したい。つまり、ソースファイルもヘッダーファイルも変更できません。さらに、ほとんどのフィールドはプライベートであり、getterおよびsetter関数を介してアクセスされます。

(ブーストチュートリアルで説明されているように)保存と読み込みのためにさまざまな関数を作成するのが良いかどうかを誰かに教えてもらえますか?...

template<class Archive>
void save(Archive & ar, gps_position &g, const unsigned int version) const
{
    // note, version is always the latest when saving
    ar  & g.deg;
    ar  & g.min;
}
template<class Archive>
void load(Archive & ar, gps_position &g, const unsigned int version)
{
    if(version > 0)
        ar & g.deg;
        ar & g.min;
}
BOOST_SERIALIZATION_SPLIT_MEMBER()

...そしてパブリック関数を使用します:

ar & g.getDeg();

それ以外の

ar & g.deg;

(セッターと同様)?? 私はC++とシリアル化に本当に慣れていないので、ヒントにとても感謝しています。

最高、アレックス

編集:チュートリアルを後押しするためのリンクを追加

4

2 に答える 2

1

これは、OPが話しているチュートリアルです。

http://www.boost.org/doc/libs/1_50_0/libs/serialization/doc/tutorial.html

分割関数を使用することが必要な場合があり、必要な場合は悪い考えではないことがわかりました。単一のvoid serialize(...)関数を使用するのは非常に便利ですが、シリアル化しようとしているクラスを変更できない場合(発生しているもののように)、それらを分割する必要がありました。void serialize(...)私は間違いなく分裂することを躊躇しませんvoid save(...)、そしてvoid load(...)それがそれが取るつもりであるならば。メモリが適切に機能する場合、サポートする関数を2つに分割する必要が__gnu_cxx::hash_mapありました。数年前のある時点ではあまり良くなかったので、データをシリアル化するためにいくつかのハックを行いました。

チュートリアルはあなたを動かしますが、それは少し欠けていて、Boost.Serializationを使うたびにある種の困難に遭遇します。ただし、これは便利なライブラリです。

于 2012-08-09T15:26:27.957 に答える
1
template<class Archive>
void load(Archive & ar, gps_position &g, const unsigned int version)
{
    if(version > 0)
    {
        int d = 0;
        ar & d;
        g.setDeg(d);
        int m = 0;
        ar & m;
        g.setMin(m);
    }
}

このようなもの。変数を宣言する->アーカイブから読み取る->setter関数を呼び出してメンバーに設定する。

于 2012-08-09T15:24:02.450 に答える