serialización - ¿Cuál es una buena forma de serializar el árbol de objetos Delphi en XML, utilizando RTTI y no un código personalizado?
serializar una clase c# (7)
Puede usar el componente JVCL TJvAppXMLFileStorage para serializar las clases derivadas de 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;
¿Cuál es una buena manera de serializar un árbol de objetos Delphi en XML, utilizando RTTI y no un código personalizado?
Me hubiera encantado encontrar que esta característica ya está integrada en Delphi, pero no parece ser así.
He encontrado algunos componentes (publicados, a continuación) que parecen que podrían realizar esta función. ¿Has usado alguno de ellos u otra oferta? ¿Has construido el tuyo? ¿Me estoy perdiendo algo obvio, en Delphi?
NativeXml de Simdesign
Enlace: http://www.simdesign.nl/xml.html
Licencia: € 29,95
Cita: un analizador sintáctico y escritor nativo de Delphi. Característica única: Almacene, lea y cree cualquier objeto TPersistent desde / hacia XML directamente (vea el Ejemplo 5). Esto se hace al iterar a través de todas las propiedades publicadas de los objetos mediante el uso de RTTI (información de tipo de tiempo de ejecución). Esta función solo está disponible para D5 y superiores.
Serializador de clase XML de DragonSoft
Enlace: http://www.dragonsoft.us/delphi_vcl.php
Licencia: Licencia bajo la Licencia Pública de Mozilla ("MPL") versión 1.1
Cita: permite serializar / deserializar objetos / componentes VCL a través de XML. Almacenar / restaurar el estado del objeto (propiedades publicadas). Soporte de clases especiales - TStrings, TCollection, TPicture. Control completo del proceso
TJvTranslator.ComponentToXML de JVCL
Enlace: http://sourceforge.net/project/showfiles.php?group_id=45786&package_id=42327
Licencia: Licencia bajo la Licencia Pública de Mozilla ("MPL") versión 1.1
Observación: Parece que se trata de serialización recursiva, pero el hecho de que esté claramente destinado a "Traducción" me da pausa.
JVCL es una opción, pero si prefiere una biblioteca pequeña e independiente, está OmniXML (Mozilla Public License 1.1, http://www.omnixml.com/ ). Lo he utilizado con éxito en varios proyectos, y me parece la biblioteca XML más simple para usar en Delphi. OmniXML viene con la unidad ''OmniXMLPersistent'', que hace lo que necesita a través de RTTI, al igual que la solución 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 significa que las propiedades se almacenarán como atributos de elementos XML; ofIndent producirá un código muy sangrado para facilitar la lectura.
// loading:
TOmniXMLWriter.LoadFromFile( pers, ''d:/path/file.xml'' );
Creé un serializador para D2006 usando SOAP XML: http://jankajanos.spaces.live.com/blog/cns!C3E2695FC6F7B0A4!791.entry
Pero también hay una edición genérica para D2009.
He subido una nueva versión. Contiene comentarios en inglés: http://janosjanka.spaces.live.com/blog/cns!E5C994C03FC0E370!181.entry Además, puede deserializar un objeto a través de tipos de clases prerregistradas. Esto es muy útil porque puede deserializar objetos sin tipos conocidos.