【问题标题】:How to serialize Delphi TObjectList<TMyClass> type to XML with TJvAppXMLFileStorage?如何使用 TJvAppXMLFileStorage 将 Delphi TObjectList<TMyClass> 类型序列化为 XML?
【发布时间】:2012-09-09 19:59:16
【问题描述】:

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

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

    JvAppXMLFileStorage.WritePersistent(...);

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

如何使用 TJvAppXMLFileStorage 序列化我的 TObjectList

【问题讨论】:

  • 我见过这个相关的问题,但它与 TCOllection 和 TObjectList 无关。 stackoverflow.com/questions/368913/…
  • 听起来是个有趣的问题,但有点不清楚你在做什么/问什么。
  • 您可以像在您链接的答案中一样使用它,只需遍历您的对象列表并使用JvAppXMLFileStorage1.WritePersistent('', ObjectList.Items[i]);
  • 这部分JediVCL源自RxLib,为16位Delphi 1.0开发。尽管 JediVCL dropepd 支持 D1-D5,但他们仍然尝试与 D6 保持兼容。所以我不希望 JediVCL 中的泛型支持,在设计时代码中支持两次(至少在 IDE 本身支持 D-T 中的泛型之前)。我可能会建议您几种方法:自己在 JVCL 中实现此功能;尝试一些围绕 Spring4Delphi 的 ORM 框架(工作尚未完成);尝试 SuperObject 或其他现代 JSON 持久层;尝试其他 XML 解析器,例如 Jedi CodeLib、OmniXML、NativeXML,希望它们支持泛型。

标签: xml delphi serialization xml-serialization jedi


【解决方案1】:

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

首先,这就是我序列化列表的方式。下面详细介绍WriteGenericsObjectListItem&lt;TMyClass&gt;方法。

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 团队提交一个补丁,以添加与所有泛型容器的兼容性。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多