私はAS3Air開発を行い、SQLiteを使用してセッション間にオブジェクトを保存します。これは、AS3開発者ガイドおよびAS3SDKリファレンスに詳しく記載されています。
データベースに格納されているクラスはIExternalizableを実装しているため、BLOBを使用してインスタンスを格納および復元できます。これはうまくいきますが、失敗した逆シリアル化に適切に対応する方法を見つけるのは困難です。この問題は、次の状況で発生します。
- シリアル化されたオブジェクト
- 保存されたオブジェクト
- クラスが変更され、プログラムが更新されました
- シリアル化されたデータは保存されたデータと一致しなくなりました
私の最初のアプローチは次のようなものです。
public class SampleClass implements IExternalizable
{
public static const version:int = 1; //increments upon program update
public var idata:int;
public function readExternal(data:IDataInput):void{
if(version != data.readInt()) //check for corrupted data
throw new IOError();
idata = data.readInt();
}
public function writeExternal(data:IDataOutput):void{
data.writeInt(version);
data.writeInt(idata);
}
}
readExternalでエラーをスローすると、悲しいことにSQLStatement.execute()がひどく失敗し、try..catchは役に立ちません。
この問題に対処するための私の現在のアイデア:
- プログラムが更新されたときにデータベースからすべてのデータを消去します(痛い)
- クラスにフラグを追加して、誤った逆シリアル化を通知します
- SQLStatement.execute()がスローされたエラーに適切に反応するようにします
1と2私はやり方を知っていますが、どちらもきれいではありません。3(まだ?)の解決策が見つかりません
他のアイデアやノウハウを高く評価しています。