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

时间:2008-12-15 16:29:22

标签: xml delphi serialization xml-serialization rtti

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

我很想发现这个功能已经内置到Delphi中,但它似乎并不是。

我发现了一些似乎可以执行此功能的组件(在下面发布)。你有没有使用过它们或其他产品?你有自己的建造吗?我在Delphi中遗漏了一些明显的东西吗?

7 个答案:

答案 0 :(得分:20)

您可以使用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;

答案 1 :(得分:14)

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' ); 

答案 2 :(得分:6)

DragonSoft的XML类序列化程序

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

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

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

答案 3 :(得分:5)

Simdesign的NativeXml

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

许可证:€29,95

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

答案 4 :(得分:4)

JVCL的TJvTranslator.ComponentToXML

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

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

观察:似乎要进行递归序列化,但它明确用于“翻译”的事实让我停下来。

答案 5 :(得分:3)

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

但是D2009也有一个通用版本。

答案 6 :(得分:1)

我上传了一个新版本。它包含英文评论: http://janosjanka.spaces.live.com/blog/cns!E5C994C03FC0E370!181.entry 此外,它还可以通过预先注册的类类型反序列化对象。 这是一个非常有用的东西,因为你可以在没有已知类型的情况下反序列化对象。