2008-09-16 2 views
6

Кто-нибудь сталкивался с проблемами, которые сериализуют компоненты в файл и считывают их обратно, особенно в том месте, где поставщик компонентов обновляет компоненты VCL. Например, файл, сериализованный с помощью DelphiX, а затем несколько лет спустя, прочитайте с delphiY. Измените формат сериализации, и если да, то что можно сделать для предотвращения чтения ошибок в компонентах при обновлении.Сериализация компонентов Delphi

ответ

3

Встроенная система RTTI для сериализации опубликованных свойств уязвима для изменений компонентов. Переход вперед управляется, пока старые свойства хранятся в новых объектах. То есть вы оставляете интерфейс свойств как есть, но можете отбросить содержимое, если хотите. Переход назад хуже - поскольку более новая версия с сохраненной версией не может быть открыта при загрузке более старой версии, и это будет проблемой.

Есть компоненты/libs (http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes), которые могут добавлять сериализацию в формате XML, и это может немного помочь, поскольку вы можете пропустить контент, который вы не знаете.

Вы по-прежнему должны помнить о том, как вы разрабатываете свой опубликованный контент и, вероятно, должны найти способ «игнорировать, но распространять» контент, который ваша текущая версия не понимает. Это позволит вам открывать и изменять файл в более новом формате, пытаясь сохранить новые атрибуты, вместо того, чтобы их лишать.

+0

Используя VCL-Streaming, вы можете обрабатывать отсутствующие свойства (и отсутствующие классы и другие ошибки) при непосредственном использовании Classes.Treader и писать обработчик для события OnError. Вы нашли весь код, необходимый в модуле Classes. Самым большим недостатком является то, что ваш класс/классы должны получить форму TComponent или, по крайней мере, от TPersistent. – 2010-03-16 09:48:46

0

Форматы будут изменяться, поскольку поставщики добавят функции к своим компонентам. Сериализация просто перебирает все опубликованные свойства и сохраняет их в потоке. Когда они будут считаны, каждый из свойств, которые считываются из потока, будет возвращен к компоненту. Если свойство больше не существует, у вас есть проблема. Я не думаю, что вы можете сделать что-нибудь об этом, кроме некоторых основных обработок исключений.

Лучший способ гарантировать совместимость - это сделать свою сериализацию.

0

Спасибо за ответ. Я пытался избежать выборочной сериализации и использовать преимущества каждого метода сериализации компонентов, но с отсутствием opf каким-либо образом «исправлять» обновление до нового формата компонента, я думаю, что обычная сериализация является единственным методом.

+0

Вы можете создавать новые выпуски, способные читать старые потоки, если у вас все еще есть поддержка чтения старых и устаревших параметров. Проблема заключается в том, что старые релизы читают новые потоки, которые не могут быть выполнены без специальной сериализации. – 2008-09-17 06:46:45