2

C++ でクラスをシリアル化する方法はありますか? クラスのインスタンスではなく、クラス自体を指しています。逆シリアル化するとき、どのクラスをインスタンス化して逆シリアル化を呼び出すかわかりません。どのクラスが表されているかをどうにかして判断し、その空のインスタンスをインスタンス化してから、逆シリアル化を呼び出すことができるようにしたいと考えています。

明確にするために編集:

各キーが厳密に型指定された値を持つキー値構造を作成しています。(一部のキーは文字列を格納する必要があり、他のキーは int を格納する必要があり、さらに他のキーは任意の値を格納する場合があります)。テンプレートを介してコンパイラによってこれが強制されるシステムを考案しました。

Key クラスには 2 つのテンプレート パラメータがあります。

  • UniqueClass - 概念ごとに 1 つの一意のクラスが必要です (通常、概念を定義するプリプロセッサ関数で定義されます)。
  • ValueType - これは、この概念の値がなければならないクラスです

Value クラスは、抽象スーパークラスを持つ ValueType のみを持つテンプレート化されたクラスであるため、その中に任意のクラスをラップできます (boost::any に似ています)。

次に、Key-Value 構造に、ConceptType と ValueType でテンプレート化されたストア関数と取得関数があります。

template<UniqueClass, ValueType>
void store( Concept<UniqueClass, ValueType> concept, ValueType value );

コンセプトの値の型と渡された値を記述するために同じテンプレートを使用しているため、それらが一致しない場合、コンパイラは文句を言います。

Key-Value ストアをシリアル化できるようにしたいと考えています。したがって、テンプレート化されたコンセプト クラスを何らかの方法でシリアル化し、逆シリアル化中に正しい任意のクラスをインスタンス化する必要があります。

私はシリアライズを呼び出すことができ、適切なすべてのオブジェクトが自分自身をシリアライズするように求められるようにしています。

4

1 に答える 1

3

質問の編集により回答が更新されました:

私が理解しているのは、手動または逆シリアル化で追加するまで、コンテナにキーが0個あるということです。これを行うには、侵入型と非侵入型の 2 つの方法があります。

押し付けがましい

Concept<U,T>から継承させてDeserializableください:

class Deserializable
{
    public:
        virtual void deserialize(InputStream& s) = 0;
        virtual int getClassId() const = 0;
};

これで、 を使用して取得した ID でクラスを識別できるようになりましたgetClassId()。というわけで、次はファクトリーを作成します。std::mapここでは、ポイントを示すために ,を使用して、非常に単純なものを使用します。より洗練されたものを自由に使用してください。

typedef Deserializable* (*createDeserializableType)();
std::map<int,createDeserializableType> factory;

// ...

factory[id1] = &createMyClass;
// etc...

// ...

// On deserialization
createDeserializable create = factory[idReadFromStream];
if(create)
    create()->deserialize(input_stream);

これは、メソッドを追加する必要があるか、メソッドを追加する必要があることを意味します(store個人的には最後のメソッドを好みます)。DeserializablestoreDeserializable

邪魔にならない

アイデアは、キー値を作成して追加すると同時に、キー値を逆シリアル化することです。

typedef void (*deserializeFctType)(InputStream&);
typedef int id_type;
std::map<id_type,deserializeFctType> factory;

このdeserializeメソッドは、作成直後に逆シリアル化された型を格納します。

あなたの質問で明確でないのは、受け入れられたリストのリストが有限か無限かということです。型の有限セットのみが「簡単に」シリアライズ可能です。

于 2012-10-04T20:25:27.410 に答える