クラスに属性を追加、削除、または変更している場合、これは互換性のない API の変更です。あなたのクラスが他の開発者によって既に使用されているソフトウェア ライブラリの一部であるかどうかを検討してください (たとえば、あなたの同僚、またはあなたのライブラリがオープンソースの場合、それをダウンロードしてそれを使用してプロジェクトを作成し始めた人など)。そのように変更すると、すぐに他の人のコードが機能しなくなったり、正しく機能しなくなる可能性があります。この種の API の変更は、主要な新しいリリース間でのみ行う必要があります (たとえば、ライブラリのバージョンが v1.XY で、v2.0.0 をリリースした場合)。
SomeClass のインスタンスをファイルにシリアル化すると、クラス名もそのファイルに保存されるため、そのインスタンスをファイルから読み戻すと、Flash はどのクラスのインスタンスを作成するかを認識します。ただし、API を変更すると、同じ SomeClass ではなくなり、名前は同じですが、クラス定義が異なることを考慮してください。それを回避する簡単な方法はありません。
そのファイル内のデータへのアクセスを維持する必要がある場合。簡単な解決策は、バージョン情報をデータ ファイルの最初の項目として保存することです。ファイル形式を変更するたびに、バージョンをインクリメントする必要があります。ファイルを書き込むときは、現在のバージョンを最初に書き込みます。ファイルを読み取るときは、現在のバージョンを読み取り、プロジェクト内のどこからでもアクセスできるクラスに public static プロパティとして保存します (たとえば、別のクラス DataLoaderInfo と public static var formatVersion:String または uint を作成します)。次に、以前と同じようにファイルを読み続けます。変更したいクラス SomeClass では、次のようになります。
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 メソッドをオーバーライドします。最初にスーパーのメソッドを呼び出してから、追加された新しいプロパティを読み書きします。
2) SomeClass のインスタンスを含む元のファイルを読み取るユーティリティ変換アプリを作成します。読み取る SomeClass ごとに、ExtSomeClass の新しいインスタンスを作成し、すべての SomeClass のプロパティをコピーして、適切なデフォルト値で ExtSomeClass プロパティを初期化する必要があります。そのため、SomeClass のすべてのインスタンスが ExtSomeClass に置き換えられます。変換されたデータをファイルに書き戻します。サブクラスを作成したくなく、元のクラス SomeClass を実際に変更したい場合は、それを行うこともできますが、古いバージョンと新しいバージョンの両方にアクセスする必要があるため、変換コードはより複雑になります。明らかに、プロジェクトで同じ名前の 2 つのクラスをコンパイルすることはできません。新しい (更新された) クラスを別の SWF にコンパイルする必要があります。変換アプリは、古いバージョンの SomeClass を使用してコンパイルする必要があります。その後、古いバージョンのファイルを読み取ることができます。SomeClass のすべてのインスタンスは、古いバージョンのクラスを使用して正しく読み取られます。Loader を使用して、新しい (更新された) クラスを含む SWF をロードします。loader.loaderInfo.applicationDomain.getDefinitionByName
新しいクラスへの参照を取得するには、この方法で新しいクラスのインスタンスを作成し、ファイルから読み取ったインスタンスからすべてのプロパティをコピーします。