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

标签 xml delphi serialization xml-serialization jedi

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

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

    JvAppXMLFileStorage.WritePersistent(...);

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

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

最佳答案

我已经通过调用 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 代码,只是将它们添加到我的程序中。
我想我会向 JCL/JVCL 团队提交一个补丁,以添加与所有泛型容器的兼容性。

希望对您有所帮助!

关于xml - 如何使用 TJvAppXMLFileStorage 将 Delphi TObjectList<TMyClass> 类型序列化为 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12462029/

相关文章:

delphi - 如何在Delphi中跟踪TScrollBox的滚动

delphi - 在 TScrollBox 中显示 DLL 中的表单

java - Talend tExtractXMLField

delphi - 有什么区别 - Delphi 在接口(interface)或实现之后使用单元?

javascript - 如何从xml文件中删除节点?

Java "NotSerializableException: java.net.Socket"不发送套接字时

java - 通过Jackson注解将带有大量属性的json反序列化为java类

Delphi组件序列化

java - 使用 XML 创建缓存时出现 InvalidServerSideConfigurationException

java - 将相对布局转换为线性布局