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