このオーバーヘッドを取り除く直接的な方法はないと思います。通常、これは 2 つのことによって行われます。まず、オブジェクトにはシリアル化メカニズムが必要です。
物事をシリアライズするには、シリアライズ先の場所が必要です。この場合、データ コンテナーを使用してこれを行いますが、これはファイル ストリームまたはコンテナー クラスの場合もあります。シリアル化はオブジェクト内または外部から行うことができます。最も簡単な実装は内部から行うことです。
単純なシリアル化部分:
class Shape{
public:
virtual void serialize( Datacontainer &o ) const = 0;
};
class Triangle: public Shape{
void serialize( Datacontainer &o ) const{
o.add('T');
o.add(corners);
}
std::vector<point> corners;
}
class Circle: public Shape{
void serialize( Datacontainer &o ) const{
o.add('C');
o.add(center);
o.add(radius);
}
point center;
double radius;
}
シリアル化中に、基本クラス Shape を使用してこれを行うことができます。
Shape *tri = new Triangle;
tri->serialize( dataContainer or file );
型を知る必要があるため、逆シリアル化はそれほど簡単ではありません。これに適したパターンはBuilder パターンです。それにもかかわらず、これを行うためにより C++ らしい方法を実装できます。
すべてのクラスに次のものを追加します。
static Shape* createFrom( Datacontainer &o );
たとえば。サークルの実装:
Shape* Circle::createFrom( Datacontainer &o )
{
Circle *c = new Circle()
c->center = o.get();
c->radius = o.get();
}
これにより、具体的なインスタンスを作成できますが、メソッドには共通の関数フットプリントがあります。これで、次のような非常に簡単なビルダーを実装できます。
class ShapeBuilder
{
public:
static Shape* createShape( Datacontainer& o )
{
char id = o.get();
swith(id){
case 'T':
return Triangle::createFrom(o);
case 'C':
return Circle::createFrom(o);
}
}
}