Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  160

•  TDictionary Custom Sort  3 337

•  Fast Watermark Sources  3 088

•  3D Designer  4 847

•  Sik Screen Capture  3 341

•  Patch Maker  3 553

•  Айболит (remote control)  3 658

•  ListBox Drag & Drop  3 015

•  Доска для игры Реверси  81 694

•  Графические эффекты  3 945

•  Рисование по маске  3 249

•  Перетаскивание изображений  2 629

•  Canvas Drawing  2 752

•  Рисование Луны  2 580

•  Поворот изображения  2 189

•  Рисование стержней  2 168

•  Paint on Shape  1 568

•  Генератор кроссвордов  2 235

•  Головоломка Paletto  1 767

•  Теорема Монжа об окружностях  2 229

•  Пазл Numbrix  1 685

•  Заборы и коммивояжеры  2 057

•  Игра HIP  1 282

•  Игра Go (Го)  1 230

•  Симулятор лифта  1 475

•  Программа укладки плитки  1 216

•  Генератор лабиринта  1 548

•  Проверка числового ввода  1 365

•  HEX View  1 497

•  Физический маятник  1 358

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

XML сериализация объектов - Заключение



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

После последовательного рассмотрения возможностей прямой загрузки/сохранения 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.




Похожие по теме исходники

Basic XML Tester

Creation XML

Askue (обработка XML)

Test XML XSD

 

INI XML Files




Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте