使用RTTI而不是自定义代码将Delphi对象树序列化为XML的好方法是什么?
我很想发现这个功能已经内置到Delphi中,但它似乎并不是。
我发现了一些似乎可以执行此功能的组件(在下面发布)。你有没有使用过它们或其他产品?你有自己的建造吗?我在Delphi中遗漏了一些明显的东西吗?
答案 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 此外,它还可以通过预先注册的类类型反序列化对象。 这是一个非常有用的东西,因为你可以在没有已知类型的情况下反序列化对象。