15

使用 RTTI 而不是自定义代码将 Delphi 对象树序列化为 XML 的好方法是什么?

我很想发现这个功能已经内置在 Delphi 中,但似乎没有。

我发现了一些似乎可以执行此功能的组件(已在下面发布)。您是否使用过它们中的任何一个或其他产品?你自己建了吗?在德尔福中,我是否遗漏了一些明显的东西?

4

7 回答 7

21

您可以使用 JVCL TJvAppXMLFileStorage 组件来序列化 TPersistent 派生类。

uses
  JvAppXMLStorage;

var
  Storage: TJvAppXMLFileStorage;
begin
  Storage := TJvAppXMLFileStorage.Create(nil);
  try
    Storage.WritePersistent('', MyObject);
    Storage.Xml.SaveToFile('S:\TestFiles\Test.xml');

    Storage.Xml.LoadFromFile('S:\TestFiles\Test.xml');
    Storage.ReadPersistent('', MyObject);
  finally
    Storage.Free;
  end;
end;
于 2008-12-15T16:44:06.197 回答
15

JVCL 是一种选择,但如果您更喜欢小型的、自包含的库,可以使用 OmniXML(Mozilla Public License 1.1,http: //www.omnixml.com/ )。我已经在几个项目中成功地使用了它,我发现它是在 Delphi 中使用的最简单的 XML 库。OmniXML 带有“OmniXMLPersistent”单元,它通过 RTTI 完成您需要的工作,就像 JVCL 解决方案一样。

// saving:
pers : TPersistent;
// SaveToFile is a class method, so no need to instantiate the object:
TOmniXMLWriter.SaveToFile( pers, 'd:\path\file.xml', pfAttributes, ofIndent );

pfAttributes 表示属性将被存储为 XML 元素的属性;ofIndent 将生成一个很好的缩进代码以提高可读性。

// loading:
TOmniXMLWriter.LoadFromFile( pers, 'd:\path\file.xml' ); 
于 2008-12-16T09:27:53.630 回答
6

DragonSoft 的 XML 类序列化器

链接: http ://www.dragonsoft.us/delphi_vcl.php

许可证:根据 Mozilla 公共许可证(“MPL”)1.1 版获得许可

引用:允许通过 XML 序列化/反序列化 VCL 对象/组件。存储/恢复对象的状态(已发布的属性)。特殊类支持 - TStrings、TCollection、TPicture。全过程控制。

于 2008-12-15T16:32:29.780 回答
5

Simdesign 的 NativeXml

链接: http ://www.simdesign.nl/xml.html

许可证: 29,95 欧元

Quote:本机Delphi XML 解析器和编写器。独特的功能:直接从 XML 存储、读取和创建任何 TPersistent 对象(参见示例 5)。这是通过使用 RTTI(运行时类型信息)迭代所有对象的已发布属性来完成的。此功能仅适用于 D5 及更高版本。

于 2008-12-15T16:33:31.587 回答
4

JVCL 的 TJvTranslator.ComponentToXML

链接: http: //sourceforge.net/project/showfiles.php ?group_id=45786&package_id=42327

许可证:根据 Mozilla 公共许可证(“MPL”)1.1 版获得许可

观察:似乎在做递归序列化,但它显然是为“翻译”而设计的,这让我停了下来。

于 2008-12-15T16:31:13.167 回答
3

我使用 SOAP XML 为 D2006 制作了一个序列化程序:http://jankajanos.spaces.live.com/blog/cns!C3E2695FC6F7B0A4! 791.entry

但是D2009也有通用版。

于 2008-12-16T19:42:05.603 回答
1

我已经上传了一个新版本。它包含英文注释: http : //janosjanka.spaces.live.com/blog/cns!E5C994C03FC0E370!181.entry 另外,它可以通过预先注册的类类型反序列化对象。这是一件非常有用的事情,因为您可以在不知道类型的情况下反序列化对象。

于 2009-12-19T07:11:54.933 回答