私は現在、C ++/Qtアプリケーションをシリアル化するための優れたオブジェクト指向設計を探しています。
次の図のように、Composite-Patternで実装されたツリー構造に基づいて編成されたアプリケーションのクラスを想像してみてください。
私が考えた2つの可能な原則:
1。)
シリアル化可能でなければならないすべてのクラスにsave()/ load()関数を配置します。これを何度も見た場合、通常はブーストで実装されます。クラスのどこかに、次のようなものがあります。
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & m_meber1;
}
これをsave()とload()に分けることもできます。ただし、このアプローチの欠点は次のとおり
です。2か月後にシリアル化を変更したくない場合(XML、HTML、またはサポートされていない非常に興味深いものに)、数千のクラスすべてを採用する必要があります。私の意見では、これは良いオブジェクト指向デザインではありません。
また、さまざまなシリアル化(XML、バイナリ、ASCIIなど)を同時にサポートしたい場合は、シリアル化機能のためだけにcppの80%が存在します。
2.)
Boostは、非侵入型のシリアル化
「http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/tutorial.html」も提供していることを知っています。
したがって、別の方法は、複合ツリー構造を反復処理し、すべてのオブジェクトをシリアル化するイテレータ(および逆シリアル化用の1つのイテレータ)を実装することです
(これは、.NET-FrameworkのXmlSerializer-Classが行うことだと思いますが、i ^ m .NETに本当に精通している)
これは、save()とload()を分離し、シリアル化が変更された場合に変更できる場所が1つしかないため、より適切に聞こえます。
したがって、これはより良いように聞こえますが、
次のようになります。-シリアル化する必要のあるすべてのパラメーターに対して、setter()とgetter()を提供する必要があります。(つまり、プライベートデータはもうありません。(これは良い/悪いですか?))
-複合ツリーに長い継承のhirarchy(5クラス以上)がぶら下がっている可能性があります。
では、派生クラスのsetter()/ getter()をどのように呼び出すのでしょうか。ベースのComposite-Componentのインターフェース関数のみを呼び出すことができる場合。
もう1つの方法は、オブジェクトデータを個別の抽象形式にシリアル化することです。そこから、可能なすべての後続のシリアル化(XML、TEXT、可能なものは何でも)がデータを取得します。1つのアイデアは、それをQDomNodeにシリアル化することでした。しかし、余分な抽象化はパフォーマンスを犠牲にするだろうと思います。
だから私の質問は:
シリアル化のための良いオブジェクト指向デザインを知っている人はいますか?
たぶん、JAVA、Python、C#などの他のプログラミング言語から。
ありがとうございました。