Какой хороший способ сериализации дерева объектов Delphi для XML - использование RTTI, а не настраиваемый код?
Какой хороший способ сериализации дерева объектов Delphi для XML - использование RTTI, а не настраиваемый код?
Мне бы очень хотелось узнать, что эта функция уже встроена в Delphi, но, похоже, это не так.
Я нашел несколько компонентов (размещенных ниже), которые, похоже, могут выполнять эту функцию. Вы использовали какое-либо из них или какое-то другое предложение? Вы создали свой собственный? Я пропустил что-то очевидное в Delphi?
Ответы
Ответ 1
Вы можете использовать компонент 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;
Ответ 2
JVCL - один из вариантов, но если вы предпочитаете небольшую автономную библиотеку, там OmniXML (Mozilla Public License 1.1, http://www.omnixml.com/). Я успешно использовал его в нескольких проектах, и я нахожу его самой простой библиотекой XML для использования в Delphi. 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' );
Ответ 3
Сегментатор XML-классов DragonSoft
Ссылка: http://www.dragonsoft.us/delphi_vcl.php
Лицензия: Лицензия на общедоступную лицензию Mozilla ( "MPL" ) версии 1.1
Цитата: Позволяет сериализовать/десериализовать объекты VCL/компоненты через XML. Сохранять/восстанавливать состояние объекта (опубликованные свойства). Поддержка специальных классов - TStrings, TCollection, TPicture. Полный контроль процесса.
Ответ 4
Simdesign NativeXml
Ссылка: http://www.simdesign.nl/xml.html
Лицензия: € 29,95
Цитата: Собственный Delphi XML-парсер и писатель. Уникальная функция: хранить, читать и создавать любые объекты TPersistent в/из XML напрямую (см. Пример5). Это делается путем повторения всех опубликованных свойств объектов с использованием RTTI (информация о типе времени выполнения). Эта функция доступна только для D5 и выше.
Ответ 5
JVCL TJvTranslator.ComponentToXML
Ссылка: http://sourceforge.net/project/showfiles.php?group_id=45786&package_id=42327
Лицензия: Лицензия на общедоступную лицензию Mozilla ( "MPL" ) версии 1.1
Наблюдение: Кажется, нужно делать рекурсивную сериализацию, но тот факт, что он явно предназначен для "Перевод", дает мне паузу.
Ответ 6
Я сделал сериализатор для D2006 с использованием SOAP XML:
http://jankajanos.spaces.live.com/blog/cns!C3E2695FC6F7B0A4!791.entry
Но есть и типовое издание для D2009.
Ответ 7
Я загрузил новую версию. Он содержит комментарии на английском языке:
http://janosjanka.spaces.live.com/blog/cns!E5C994C03FC0E370!181.entry
Кроме того, он может десериализовать объект через предварительно зарегистрированные типы классов.
Это очень полезно, потому что вы можете десериализовать объекты без известных типов.