将Delphi对象树序列化为XML的好方法是什么 - 使用RTTI而不是自定义代码?
我本来希望发现这个功能已经内置到Delphi中,但它似乎并没有.
我发现了一些似乎可以执行此功能的组件(在下面发布).你有没有使用过它们或其他产品?你有自己的建造吗?我在Delphi中遗漏了一些明显的东西吗?
您可以使用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;
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' );
DragonSoft的XML类序列化器
链接: http ://www.dragonsoft.us/delphi_vcl.php
许可:根据Mozilla公共许可证("MPL")1.1版获得许可
Quote:允许通过XML序列化/反序列化VCL对象/组件.存储/恢复对象的状态(已发布的属性).特殊课程支持 - TStrings,TCollection,TPicture.全过程控制.
Simdesign的NativeXml
链接: http ://www.simdesign.nl/xml.html
执照: 29,95欧元
Quote:本机Delphi XML解析器和编写器.独特功能:直接在XML中存储,读取和创建任何TPersistent对象(参见Example5).这是通过使用RTTI(运行时类型信息)遍历所有对象的已发布属性来完成的.此功能仅适用于D5及更高版本.