Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
XML сериализация объектов - Заключение

Оформил: DeeCo

Автор: Чудин Андрей

После последовательного рассмотрения возможностей прямой загрузки/сохранения XML документов в объекты Delphi/С++Builder стоит подвести некоторые итоги и ответить на вопросы о применимости данного подхода.

Применимость

1. Метод подходит для создания собственных типов XML документов. Когда есть необходимость оперативно разработать свой формат для обмена данными, то проблем возникать не должно. В такой ситуации это может быть оптимальным подходом. Поскольку формат разрабатывается заново, то мы можем учесть все ограничения предложенной реализации и не использовать атрибуты. При этом достаточно спроектировать необходимые нам классы, а вся остальная работа будет проделана автоматически.
2. Метод подходит для обработки XML документов, в которых не используются атрибуты. Подобных типов документов не много, но если они подходят, то такой путь их обработки достаточно удобен. Так автором статьи в рабочем проекте описанным методом обрабатываются документы стандарта ONIX XML. В этом формате присутствует атрибут только у одного элемента, а подобное ограничение можно обойти предварительной обработкой загружаемого документа.
Применимость может стать почти универсальной, если доработать код для обработки атрибутов элементов.

Производительность

Код загрузки XML документа в объект дает вполне приемлемую производительность. Тестирование дало следующие результаты.

Документ: формат ONIX XML размером 10 мб.

Системная конфигурация: Celeron 450 / 256 / Windows 2000prof парсер приблизительное время загрузки MS XML Parser 2.6 синхронная загрузка без проверки состоятельности ~6 сек MS XML Parser 2.6 синхронная загрузка с проверкой состоятельности ~11 сек Компонент TglXMLSerializer 8,5 секКомпонент TglXMLSerializer загружает данные в синхронном режиме. Он не использует DTD или схемы. При загрузке проводится проверка правильности (well-formed) и частично - состоятельности (valid). При нарушении правильности документа парсер выдаст соответствующее исключение и прекратит загрузку.

Проверка состоятельности определяется тем, что при загрузке данные загружаются в свойства объекта. Если одноименное элементу XML документа свойство не найдено, то генерируется исключение. Так как свойства объекта типизированы и при загрузке происходит преобразование текстовых значений, то ошибки, здесь возникающие, говорят о нарушении состоятельности документа. Таким образом, интерфейс нашего объекта играет роль XML схемы, что очень удобно. Более того, эти проверки могут быть расширены дополнительным кодом в обработчиках свойств объекта.

Расширяемость

Приведенная реализация имеет ряд ограничений. Первое и основное - это отказ от использования элементов в атрибутах XML документов. Это ограничение может быть снято переработкой кода парсера и процедур сохранения XML. Для отличия элементов от атрибутов в интерфейсе объектов можно придти к следующему соглашению:
  • Все классовые типы являются элементами
  • Все простые типы являются атрибутами соответствующих объектов
Пример.
TPerson = class;
TMyXMLMessage = class(TPersistent)
published
  property LanguageOfText: WideString;
  property ToPerson: TPerson;
end;

TPerson = class(TPersistent)
published
  property FirstName: WideString;
  property LastName: WideString;
end;
Таким образом, в первом случае объект приведенного выше класса TMyXMLMessage при сериализации даст следующий XML код:
<TMyXMLMessage>
<LanguageOfText>english</LanguageOfText>
	<ToPerson>
		<FirstName>Osama</FirstName>
		<LastName>Unknoun</LastName>
	</ToPerson>
</TMyXMLMessage>
При обработке простых типов как атрибутов получим следующий более компактный код:
<TMyXMLMessage LanguageOfText="english">
	<ToPerson FirstName="Osama" LastName="Unknoun"/>
</TMyXMLMessage>
Второй вариант позволяет работать с любыми документами, однако надо решить, каким образом описывать данные #CDDATA. Возможно, для этого придется зарезервировать какой-либо тип.

Второе ограничение, которое следует упомянуть, это способ описания коллекций. В приведенной реализации коллекции сохраняются в виде тега свойства, в который вложены описания элементов коллекции. Довольно часто в XML документах повторяющаяся группа тегов не заключается специально в теги, отделяющие эту группу. Это является препятствием для написания классов для обработки уже существующих документов. Поэтому необходимо предусмотреть и такую возможность.

Приведенная реализация будет постоянно обновляться, в том числе и на основании Ваших, уважаемый читатель, предложений. Последняя версия компонента с исходными текстами входит в библиотеку Globus VCL Extention Library.
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay