2008-09-16 5 views
6

コンポーネントベンダがVCLコンポーネントをアップグレードする領域で、コンポーネントをファイルにシリアル化して読み込む問題があります。たとえば、DelphiXでシリアライズされ、その後数年後にdelphiYで読み込まれるファイル。シリアライゼーション形式が変更されているかどうか、アップグレードする場合は、アップグレード時にコンポーネントでエラーが読み取られるのを防ぐために何ができるか。Delphiコンポーネントのシリアル化

答えて

3

公開されたプロパティをシリアル化するためのビルトインRTTIベースのシステムは、コンポーネントの変更に対して脆弱です。古い物件が新しい物件に保管されている限り、将来の進歩は管理可能です。私。プロパティインターフェースはそのままの状態にしておきますが、好きな場合は内容を破棄することができます。古いバージョンのロードで新しいバージョンの保存されたプロパティを開くことができず、それが問題になります。

XML形式のシリアル化を追加できるコンポーネント/ライブラリ(http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes)があります。これは、わからないコンテンツをスキップするのに役立ちます。

パブリッシュされたコンテンツをどのようにデザインするかについて注意する必要があります。現在のバージョンでは理解できないコンテンツを「無視して伝播」する方法を見つけるべきでしょう。これにより、より新しいアトリビュートを削除しようとせずに、新しいアトリビュートを保持しようとしている間に、新しいフォーマットでファイルを開いて変更することができます。

+0

VCLストリーミングを使用すると、Classes.TReaderを直接使用してOnErrorイベントのハンドラを記述するときに、不足しているプロパティ(およびクラスやその他のエラーも)を処理できます。 Classesユニットに必要なすべてのコードが見つかりました。 最大の欠点は、あなたのクラス/クラスがTComponentから派生しなければならない、あるいは少なくともTPersistentから派生しなければならないということです。 –

0

ベンダーがコンポーネントに機能を追加するため、フォーマットが大幅に変更されます。シリアライゼーションは、公開されたすべてのプロパティをループし、ストリームに保存します。それらを読み戻すと、ストリームから読み取られた各プロパティがコンポーネントに戻されます。プロパティがもう存在しない場合は、問題があります。基本的な例外処理以外に何もできないと思います。

互換性を保証する最良の方法は、独自のシリアル化を行うことです。

0

返信いただきありがとうございます。私はカスタムシリアル化を避け、各コンポーネントのシリアライゼーション手法を利用しようとしていましたが、新しいコンポーネントフォーマットへのアップグレードを「パッチする」方法がないため、カスタムシリアル化が唯一の方法だと思います。

+0

旧リリースと廃止されたパラメータのサポートをまだ読んでいる限り、新しいリリースで古いストリームを読み込めるようにすることができます。問題は、旧式リリースでカスタムストリームを作成せずには行えない新しいストリームを読み込むことにあります。 –

関連する問題