如何使用TJvAppXMLFileStorage将Delphi TObjectList <TMyClass>类型序列化为XML?

Tri*_*enT 5 xml delphi serialization xml-serialization jedi

以前,为了保存某些应用程序的设置,我使用了:

  • A TSettings = class(TPersistent)为容器
  • 要在已发布的属性中序列化的每个数据
  • 对象列表是TCollectionTCollectionItem类型
  • 使用单行保存所有内容的TJvAppXMLFileStorage组件:

    JvAppXMLFileStorage.WritePersistent(...);

但是现在,我正在使用TObjectList作为TSettings类中的属性.
所以我放弃了TCollection/TCollectionItem以支持泛型 ...
当序列化时,没有项目列表 ......我认为这是因为TObjectList不是来自TPersistent.

如何使用TJvAppXMLFileStorage序列化我的TObjectList <>

Tri*_*enT 2

我已经通过调用 ,用几行代码成功序列化了我的通用列表JvAppXMLFileStorage.WriteList

首先,这就是我序列化列表的方式。WriteGenericsObjectListItem<TMyClass>下面详细介绍该方法。

JvAppXMLFileStorage.WriteList('mylist',TObject(MyGenericList), MyGenericList.Count, WriteGenericsObjectListItem<TMyClass>);
Run Code Online (Sandbox Code Playgroud)

然后,我只需要定义如何序列化通用列表的每个项目。为此,我创建了一个通用方法:

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;
Run Code Online (Sandbox Code Playgroud)

就是这样!
我没有修改JCL/JVCL代码,只是将它们添加到我的程序中。
我想我会向 JCL/JVCL 团队提交一个补丁,以添加与所有泛型容器的兼容性。

我希望这可以帮助你!