特にコンポーネント ベンダーが VCL コンポーネントをアップグレードする領域で、コンポーネントをファイルにシリアライズして読み戻す際に問題が発生した人はいますか。たとえば、ファイルは DelphiX でシリアル化され、数年後に delphiY で読み戻されます。シリアライゼーション形式は変更されますか? 変更された場合、アップグレード時にコンポーネントの読み取りエラーを防ぐために何ができますか?
3 に答える
公開されたプロパティをシリアル化する組み込みの RTTI ベースのシステムは、コンポーネントの変更に対して脆弱です。古いプロパティが新しいオブジェクトに保持されている限り、先に進むことは管理可能です。つまり、プロパティ インターフェイスはそのままにしておきますが、必要に応じてコンテンツを捨てることができます。古いバージョンのロードでは新しいバージョンの保存されたプロパティを開くことができず、それが問題になるため、逆方向に進むのはさらに悪いことです。
XML形式でシリアル化を追加できるコンポーネント/ライブラリ(http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes)があり、そうでないコンテンツをスキップすることを選択できるため、これは少し役立つかもしれません知る。
パブリッシュされたコンテンツをどのように設計するかについては、依然として気を配る必要があり、現在のバージョンが理解できないコンテンツを「無視して広める」方法をおそらく見つける必要があります。これにより、新しい属性を削除するのではなく、保持しながら、新しい形式でファイルを開いて変更することができます。
ベンダーがコンポーネントに機能を追加するにつれて、フォーマットは確実に変化します。シリアル化は、発行されたすべてのプロパティを単純にループし、それらをストリームに保存します。それらが読み戻されると、ストリームから読み取られた各プロパティがコンポーネントに設定されます。プロパティがもう存在しない場合は、問題があります。基本的な例外処理以外に、それについて何もできないと思います。
互換性を保証する最善の方法は、独自のシリアル化を行うことです。
返信いただきありがとうございます。カスタムのシリアライゼーションを回避し、各コンポーネントのシリアライゼーション手法を利用しようとしましたが、新しいコンポーネント形式へのアップグレードを「パッチ」する方法がないため、カスタムのシリアライゼーションが唯一の方法だと思います。