あなたのクラスに属性を追加、削除または変更する場合は、これは互換性のないAPIの変更です。あなたのクラスが既に他の開発者(例えば、同僚、またはあなたのライブラリがオープンソースである場合、それをダウンロードしてプロジェクトを作成した人)がすでに使用しているソフトウェアライブラリの一部である場合、そのように変更すると、すぐに他の人のコードが動作しなくなったり、正しく動作しなくなる可能性があります。このようなAPIの変更は、主要な新リリース(たとえば、ライブラリのバージョンがv1.X.Y、リリースがv2.0.0)間でのみ許可する必要があります。
SomeClassのインスタンスをファイルにシリアル化すると、クラス名もそのファイルに保存されるため、インスタンスをファイルから読み込むときに、Flashは作成するクラスのインスタンスを認識します。ただし、APIを変更した場合、それはもはや同じSomeClassではなく、名前は同じですが、クラス定義は異なります。その周りに簡単な方法はありません。
本当にそのファイルのデータにアクセスする必要がある場合。簡単な解決策は、データファイルのバージョン情報を最初の項目として保存することです。ファイル形式を変更するたびに、バージョンを増やす必要があります。ファイルを書き込むときは、まず現在のバージョンを書いてください。ファイルを読み込むときは、現在のバージョンを読み込み、プロジェクト内のどこからでもアクセスできるクラス(たとえば、DataLoaderInfoクラスとstatic static var formatVersion:Stringまたはuintクラス)に公開静的プロパティとして格納します。その後、前と同じようにファイルを読み続ける。変更したいクラス工ass、では、次のようになります。
function readExternal(input:IDataInput):void {
// Read format version 0 properties.
oldIntProperty1 = input.readInt();
oldIntProperty2 = input.readInt();
...
// Read format version 1 properties.
if (DataLoaderInfo.formatVersion >= 1) {
newIntProperty1 = input.readInt();
...
}
// Read format version 2 properties.
if (DataLoaderInfo.formatVersion >= 2) {
...
}
...
}
あなたは多くのファイル形式のバージョンを持っている場合は、想像することができ、コードが非常に複雑になる可能性があります。それは、開発しているアプリケーションの種類と同時にいくつかのバージョンがフィールドに展開されるかによって異なります。たとえば、アプリがモバイルアプリで設定や状態をバイナリファイルに保存している場合、各ユーザーは異なる間隔で更新する可能性があるため、ユーザーは別の古いバージョンから最新のバージョンにアップグレードする可能性があります。これらすべてのバージョンの設定を正常に読み込みます。すべてのデータが自分のサーバーに保存されていて、このデータへの唯一のアクセスがサーバーにデプロイされた最新バージョンのアプリケーションである場合は、最後に展開されたバージョンと現在の(新しい)バージョン。
また、別のユーティリティアプリを使用して、データファイルを更新された形式に変換することを検討することもできます。
1)元のクラスSomeClassのサブクラスExtSomeClassを作成します。新しいAPI(プロパティなど)をサブクラスに追加します。クラスのIExternalizableメソッドをオーバーライドしてから、superのメソッドを呼び出してから、追加された新しいプロパティを読み書きします。
2)SomeClassのインスタンスを含む元のファイルを読み込むユーティリティ変換アプリを作成します。読み込んだすべてのSomeClassについて、ExtSomeClassの新しいインスタンスを作成し、SomeClassのすべてのプロパティをコピーし、適切なデフォルト値でExtSomeClassプロパティを初期化する必要があります。したがって、SomeClassのすべてのインスタンスはExtSomeClassに置き換えられます。変換されたデータをファイルに書き戻します。 サブクラスを作成したくない場合、元のクラスSomeClassを実際に変更したい場合は、それを行うこともできますが、コンバージョンコードがより難しくなります。これは、古いバージョンと新しいバージョンの両方にアクセスする必要があるためです。あなたのクラスでは、あなたのプロジェクトで同じ名前の2つのクラスをコンパイルすることはできません。新しい(更新された)クラスを別のSWFにコンパイルする必要があります。変換アプリはSomeClassの古いバージョンを使用してコンパイルする必要がありますあなたの古いバージョンのファイルを読むことができます、あなたのクラスの古いバージョンを使用してSomeClassのすべてのインスタンスが正しく読み込まれます。 Loaderを使用して新しい(更新された)クラスを含むSWFをロードし、loader.loaderInfo.applicationDomain.getDefinitionByName
を使用して新しいクラスへの参照を取得し、この方法で新しいクラスのインスタンスを作成してから、ファイル。