Какой хороший способ сериализации дерева объектов 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

Наблюдение: Кажется, нужно делать рекурсивную сериализацию, но тот факт, что он явно предназначен для "Перевод", дает мне паузу.

Ответ 7

Я загрузил новую версию. Он содержит комментарии на английском языке: http://janosjanka.spaces.live.com/blog/cns!E5C994C03FC0E370!181.entry Кроме того, он может десериализовать объект через предварительно зарегистрированные типы классов. Это очень полезно, потому что вы можете десериализовать объекты без известных типов.