Какой хороший способ сериализации дерева объектов Delphi в XML - с использованием RTTI, а не пользовательского кода? - PullRequest
14 голосов
/ 15 декабря 2008

Какой хороший способ сериализации дерева объектов Delphi в XML - с использованием RTTI, а не пользовательского кода?

Мне бы очень хотелось узнать, что эта функция уже встроена в Delphi, но, похоже, ее нет.

Я обнаружил несколько компонентов (опубликовано ниже), которые могут выполнять эту функцию. Вы использовали какой-либо из них или какое-либо другое предложение? Вы построили свой собственный? Я что-то упускаю в Delphi?

Ответы [ 7 ]

20 голосов
/ 15 декабря 2008

Вы можете использовать компонент 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;
14 голосов
/ 16 декабря 2008

JVCL - один из вариантов, но если вы предпочитаете небольшую автономную библиотеку, есть OmniXML (Общественная лицензия Mozilla 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' ); 
6 голосов
/ 15 декабря 2008

Сериализатор класса DragonSoft XML

Ссылка: http://www.dragonsoft.us/delphi_vcl.php

Лицензия: Лицензия на использование публичной лицензии Mozilla ("MPL") версии 1.1

Цитата: Позволяет сериализовать / десериализовать объекты / компоненты VCL через XML. Сохранить / восстановить состояние объекта (опубликованные свойства). Поддержка специальных классов - TStrings, TCollection, TPicture. Полный контроль процесса.

5 голосов
/ 15 декабря 2008

NativeXml от Simdesign

Ссылка: http://www.simdesign.nl/xml.html

Лицензия: € 29,95

Цитата: Собственный Delphi XML-парсер и средство записи Уникальная возможность: хранить, читать и создавать любые объекты TPersistent в / из XML напрямую (см. Пример 5). Это делается путем перебора всех опубликованных свойств объектов с использованием RTTI (информация о типе среды выполнения). Эта функция доступна только для D5 и выше.

4 голосов
/ 15 декабря 2008

TJvTranslator.ComponentToXML от JVCL

Ссылка: http://sourceforge.net/project/showfiles.php?group_id=45786&package_id=42327

Лицензия: Лицензия на использование публичной лицензии Mozilla ("MPL") версии 1.1

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

3 голосов
/ 16 декабря 2008

Я сделал сериализатор для D2006 с использованием SOAP XML: http://jankajanos.spaces.live.com/blog/cns!C3E2695FC6F7B0A4!791.entry

Но есть и универсальное издание для D2009.

1 голос
/ 19 декабря 2009

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

...