2013-01-03 47 views
0

我做AS3 Air開發並使用SQLite在會話之間存儲對象,這些對象在AS3 Developer Guide以及AS3 SDK Reference中有詳細記錄。如何處理數據不一致? AS3 IExternalizable.readExternalData + sqlstatement.execute()

存儲在數據庫中的類實現IExternalizable,以便可以使用BLOB存儲和恢復實例。這工作得很好,但我很難找到如何對錯誤的反序列化做出正確反應。

  1. 對象系列化
  2. 對象保存的
  3. 類改變和程序更新
  4. 序列化的數據不再匹配保存的數據

我最初的做法是什麼:在下列情況下,會出現問題像這樣:

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是沒有用的。

我現在的想法來處理這個問題:

  1. 擦除從數據庫中的所有數據的程序時會自動更新(哎喲)
  2. 添加標誌,以一流的信號故障反序列化
  3. 讓SQLStatement.execute( )正確反應引發錯誤

1和2我知道該怎麼做,但都不漂亮。 3我沒有找到解決方案(尚未?)

其他想法或專業知識的讚賞。

回答

1

你好,這是在Adobe AIR 1.5食譜(9.13遷移序列化的變化在ActionScript)提供由Greg Jastrab他建議在下面的代碼示例使用的版本更改命名空間的記載:

public class WeatherData implements IExternalizable { 
    namespace wd1_0 = "WD1.0"; 
    namespace wd1_1 = "WD1.1"; 

    protected var version:String; 
    public var date:Date; 
    public var low:Number; 
    public var high:Number; 

    public function WeatherData() { 
     version = "WD1.1"; 
     date = new Date(); 
     low = high = 0; 
    } 
    public function readExternal(input:IDataInput):void { 
     version = input.readUTF(); 
     var ns:Namespace = new Namespace(version); 
     ns::parse(input); 
    } 
    public function writeExternal(output:IDataOutput):void { 
     output.writeUTF(version); 
     output.writeObject(date); 
     output.writeFloat(low); 
     output.writeFloat(high); 
    } 
    wd1_0 function parse(input:IDataInput):void { 
     date = input.readObject() as Date; 
     high = input.readFloat(); 
    } 
    wd1_1 function parse(input:IDataInput):void { 
     date = input.readObject() as Date; 
     low = input.readFloat(); 
     high = input.readFloat(); 
    } 
} 

我用這個解決方案,它可以作爲承諾的:)和以下是「算法」在未來的版本中加入的新成員

  1. 添加新的變量
  2. 修改到的writeExternal它包括在系列化
  3. 在構造
  4. 遞增版本字符串
  5. 新版本
  6. 添加新的命名空間添加解析功能範圍的新的命名空間和implemend的readExternal以匹配修改的writeExternal

問候

+0

謝謝你的回覆。我從來沒有見過像這樣使用過的命名空間 - 你每天都變得更聰明。 –