TObjectList<T>
汎用コンテナのシリアル化をどのように実行できるのか疑問に思っています。基本的に、そのリストにさまざまなオブジェクトを格納したいのですが、すべてのオブジェクトはTSerializable
、次のように定義されているから派生します。
TSerializable = class abstract(TObject)
public
{ Public declarations }
procedure LoadFromStream(const S: TStream); virtual; abstract;
procedure SaveToStream(const S: TStream); virtual; abstract;
end;
ここで、これらのクラスをアプリのどこかに定義したとしましょう。
type
TExampleClass = class(TSerializable)
private
{ Private declarations }
FIntProp: Integer;
public
{ Public declarations }
constructor Create();
procedure LoadFromStream(const S: TStream); override;
procedure SaveToStream(const S: TStream); override;
property IntProp: Integer read FIntProp write FIntProp;
end;
TAnotherExample = class(TSerializable)
private
{ Private declarations }
FStringProp: String;
public
{ Public declarations }
constructor Create();
procedure LoadFromStream(const S: TStream); override;
procedure SaveToStream(const S: TStream); override;
procedure ReverseStringProp();
property StringProp: String read FStringProp write FStringProp;
end;
このようなオブジェクトをリストに保存することを計画しています。
var
MS: TMemoryStream;
SomeList: TObjectList<TSerializable>;
begin
MS := TMemoryStream.Create();
SomeList := TObjectList<TSerializable>.Create(True);
try
SomeList.Add(TExampleClass.Create());
SomeList.Add(TAnotherClass.Create());
TExampleClass(SomeList[0]).IntProp := 1992;
TAnotherClass(SomeList[1]).StringProp := 'Some value';
// Here, a method to serialize the list...
SerializeList(SomeList, MS);
// Clear the list and reset position in the stream.
SomeList.Clear();
MS.Seek(0, soFromBeginning);
// Unserialize the list.
UnserializeList(SomeList, MS);
// Should display "Some value".
Writeln(TAnotherClass(SomeList[1]).StringProp);
finally
SomeList.Free();
MS.Free();
end;
end;
では、リスト全体をシリアル化してストリーム化し、そのストリームからリストを再作成するにはどうすればよいでしょうか。
私が考えていたのは:
- リストを繰り返します。
- 最初に、各オブジェクトのクラス名をストリームに書き込みます。
SaveToStream()
そのオブジェクトを呼び出します。
しかし、そのアプローチを機能させるには、ある種のクラスレジスタを作成する必要があります。これは、既知のクラスを格納するためのある種の辞書になります。それは良い考えのように聞こえますが、それから私はRegisterClass()
すべての新しいクラスを辞書に追加するためにいくつかのメソッドを呼び出す必要があります、そして私はその方法があまり好きではありません。
他の方法はありますか、それとも私が提案した方法でそれを行うべきですか?
本当にありがとう。