5

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

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

    JvAppXMLFileStorage.WritePersistent(...);

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

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

4

1 回答 1

2

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

首先,这就是我序列化 list 的方式。下面详细介绍该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 代码,只是将这些添加到我的程序中。
我想我会向 JCL/JVCL 团队提交一个补丁,以添加与所有泛型容器的兼容性。

我希望这可以帮助你!

于 2012-09-21T07:29:46.063 回答