5

以前は、一部のアプリケーションの設定を保存するために、次のものを使用しました。

  • TSettings = class(TPersistent)コンテナのA
  • 公開されたプロパティでシリアル化する各データ
  • オブジェクトのリストはTCollectionおよびTCollectionItemタイプでした
  • 1行ですべてを保存するTJvAppXMLFileStorageコンポーネント:

    JvAppXMLFileStorage.WritePersistent(...);

しかし今、私はTSettingsクラスのプロパティとしてTObjectListを使用していますそこで、ジェネリックス
を優先してTCollection / TCollectionItemを削除します... シリアル化すると、アイテムのリストがありません...TObjectListがTPersistentからのものではないためだと思います。

TObjectList <>TJvAppXMLFileStorageでシリアル化するにはどうすればよいですか?

4

1 に答える 1

2

を呼び出すことで、数行のコードでジェネリックリストを正常にシリアル化できましたJvAppXMLFileStorage.WriteList

まず、これが私がリストをシリアル化した方法です。このWriteGenericsObjectListItem<TMyClass>方法の詳細を以下に示します。

JvAppXMLFileStorage.WriteList('mylist',TObject(MyGenericList), MyGenericList.Count, WriteGenericsObjectListItem<TMyClass>);

次に、ジェネリックリストの各アイテムをシリアル化する方法を定義する必要があります。このために、私はジェネリックメソッドを作成しました:

procedure TMySerializer.WriteGenericsObjectListItem<T>(Sender: TJvCustomAppStorage;
  const Path: string; const List: TObject; const Index: Integer; const ItemName: string);
begin
  if(List is TObjectList<T>) then
    if Assigned(TObjectList<T>(List)[Index]) then
      Sender.WritePersistent(Sender.ConcatPaths([Path, Sender.ItemNameIndexPath (ItemName, Index)]), TPersistent(TObjectList<T>(List)[Index]));
end;

それでおしまい!
JCL / JVCLコードを変更しておらず、プログラムに追加するだけです。
すべてのGenericsコンテナーとの互換性を追加するために、JCL/JVCLチームにパッチを提出すると思います。

これがお役に立てば幸いです。

于 2012-09-21T07:29:46.063 に答える