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

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

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

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

7 ответов


для сериализации производных классов TPersistent можно использовать компонент JVCL TJvAppXMLFileStorage.

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;

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' ); 

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

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

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

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


NativeXml Simdesign

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

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

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


TJvTranslator JVCL.ComponentToXML

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

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

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


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

но есть общий выпуск для D2009 тоже.


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