Сериализация компонентов Delphi - PullRequest
6 голосов
/ 16 сентября 2008

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

Ответы [ 3 ]

3 голосов
/ 16 сентября 2008

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

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

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

0 голосов
/ 16 сентября 2008

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

0 голосов
/ 16 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...