2

I have a little problem with boost serialization. There are many examples that shows how to serialize a derived class pointer through the base class pointer by simply using BOOST_CLASS_EXPORT and BOOST_CLASS_EXPORT_IMPLEMENT. This is working fine and have no problems at all.

However, I do not want to serialize a pointer, as the deserialization in the other side should be again over a pointer and then, boost creates a new instance of the serialized object.

I can serialize a dereferenced pointer and then deserialize again over an existing object instance without problems, and no new instances are created. However, when the dereferenced pointer is over the base class, the derived class is not serialized as expected when serializing over pointers.

Working example:

Class A;
Class B : public A;

A* baseClass = new B();
ar << baseClass // works perfectly

Not working example:

Class A;
Class B : public A;
A* baseClass = new B();
ar << *baseClass; // only A is serialized

I can get it working by simple serializing over the derived class like:

B* derivedClass = new B();
ar << *derivedClass; // works fine

But all the references I have in my structures are of base class type. Also I cannot serialize the pointer as I do not need to instantiate new objetcs when deserializing, only "overwrite" the contents over an existing instance.

I have tried to serialize the pointer and trying to deserialize over an existing instance, but this does not work correctly. When I say deserialize over an existing instance, I mean:

A* baseClass = new B();
// baseClass is used in the program and in a given moment, its contents must be overwrite, so:
ar >> *baseClass;

As I said, I do not need a new instance of baseClass when deserializing. So, is there any way to get this working?

4

2 に答える 2

1

私は問題を理解していると思います。あなたがするとき

ar >> *DerivedClass;

への参照を渡していますoperator<<。Boost-usersメーリングリストのこの質問に対するRobert Rameyの回答から収集したように、基本クラスへの参照を介してアクセスされるオブジェクトは適切にシリアル化されません。serialize答えは数年前のものですが、考えてみれば、書くメソッドは仮想ではない (テンプレートであるため、仮想にすることはできません)ため、今でも当てはまると思います。

したがって、ライブラリはポインターを処理するために特別なことをしているに違いありませんが、参照ではそれを行っていません。私が見つけた醜い解決策は、次のような (仮想) シリアル化関数のペアを追加することです。

virtual myser(iarchive &ia) {ia >> *this;}
virtual myser(oarchive &oa) {oa << *this;}

どこiarchiveoarchive必要なアーカイブに置き換える必要があります。2 つの追加関数を作成する必要があることは別として、必要なすべてのアーカイブ タイプに対して明示的にそれらをオーバーロードする必要があるため、これは本当に最悪です。残念ながら、私はより良い解決策を知りません。

于 2014-02-04T22:17:35.083 に答える