Delphi: потоковые объекты в XML, включая свойства массива - PullRequest
3 голосов
/ 08 февраля 2011

У нас есть огромная структура объектов данных, содержащая множество свойств, которые на самом деле являются массивами.Теперь нам нужно передать данные в документ XML.

Для этого мы решили использовать для потоковой передачи компонент NativeXML .Он использует тот же механизм, который также используется для потоковой передачи TComponent.Это работает довольно хорошо, за исключением того, что оно не передает потоковые индексированные свойства.

Есть ли способ сделать это в любом случае, или есть компоненты, способные сделать это?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2011

Индексированные свойства не предоставляются RTTI (и по-прежнему отсутствуют в Delphi XE), а также не передаются TComponent.

Если вы хотите остаться с механизмом TComponent (или потоковой передачей на основе чистого RTTI), одним из вариантов является использование TCollection, который действительно передается в потоковом режиме «как массив». Однако это накладывает серьезные ограничения на ваши массивы, т.е. их контейнер должен быть подклассом TCollection, а их элементы должны быть подклассом TCollectionItem.

Я не знаю компонентов NativeXML, но если они основаны на TWriter / TReader, другим вариантом может быть использование DefineProperties , это позволяет вам определять свои собственные свойства, а затем вы можете передавать как хочешь, сколько пожелаешь.
Это включает специальный код для потоковой передачи, но вы можете поместить этот код в атрибуты класса, если ваши массивы не слишком специфичны, и обрабатывать все в одном из ваших корневых классов.

0 голосов
/ 16 февраля 2011

В конце мы прибегли к созданию нескольких дополнительных классов (унаследованных от TPersistent) для хранения свойств массива; оказалось, что существует только ограниченный набор типов массивов. Индексированные свойства Delphi оказались действительно полезными: мы могли просто указать одну функцию-получатель и определить большинство фиксированных элементов массива как отдельные свойства, ссылающиеся на этот один получатель, и индекс. Эти свойства теперь сериализуются как правильные элементы XML, а также с правильным именем.

Однако добавление конструкторов и деструкторов во все классы с их использованием заняло несколько утомительных часов.

В любом случае, спасибо за все предложения!

...