Reputation: 2341
What's a good way to serialize a Delphi object tree to XML--using RTTI and not custom code?
I would have loved to find that this feature is already built into Delphi, but it doesn't seem to be.
I've found a few components (posted, below) that seem like they might perform this function. Have you used any of them or some other offering? Have you built your own? Am I missing something obvious, in Delphi?
Upvotes: 15
Views: 14104
Reputation: 11
I've uploaded a new version. It contains english comments: http://janosjanka.spaces.live.com/blog/cns!E5C994C03FC0E370!181.entry In addition, it can deserialize an object through pre-registred class types. This is a very useful thing because you can deserialize objects without know types.
Upvotes: 1
Reputation:
I've made a serializer for D2006 using SOAP XML: http://jankajanos.spaces.live.com/blog/cns!C3E2695FC6F7B0A4!791.entry
But there is a generic edition for D2009 too.
Upvotes: 3
Reputation: 7316
JVCL is one choice, but if you prefer a small, self-contained library, there's OmniXML (Mozilla Public License 1.1, http://www.omnixml.com/ ). I've used it successfully in several projects, and I find it the simplest XML library to use in Delphi. OmniXML comes with 'OmniXMLPersistent' unit, which does what you need via RTTI, just like the JVCL solution does.
// 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 means properties will be stored as attributes of XML elements; ofIndent will produce a nicely indented code for readability.
// loading:
TOmniXMLWriter.LoadFromFile( pers, 'd:\path\file.xml' );
Upvotes: 15
Reputation: 8141
You can use the JVCL TJvAppXMLFileStorage component to serialize TPersistent derived classes.
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;
Upvotes: 21
Reputation: 2341
Simdesign's NativeXml
Link: http://www.simdesign.nl/xml.html
Licence: € 29,95
Quote: A native Delphi XML parser and writer. Unique feature: Store, read and create any TPersistent object to/from XML directly (see Example5). This is done by iterating through all of the objects' published properties by use of RTTI (runtime type information). This feature is only available for D5 and up.
Upvotes: 5
Reputation: 2341
DragonSoft's XML Class Serializer
Link: http://www.dragonsoft.us/delphi_vcl.php
Licence: Licensed under the Mozilla Public Licence ("MPL") version 1.1
Quote: Allows to serialize/deserialize VCL Objects/Components via XML. Store/restore state of the object (published properties). Special classes support - TStrings, TCollection, TPicture. Full process control.
Upvotes: 6
Reputation: 2341
JVCL's TJvTranslator.ComponentToXML
Link: http://sourceforge.net/project/showfiles.php?group_id=45786&package_id=42327
Licence: Licensed under the Mozilla Public Licence ("MPL") version 1.1
Observation: Seems to do recursive serialization, but the fact that it is clearly intended for "Translation" gives me pause.
Upvotes: 4