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.
|