2010-07-15 25 views
0

我正試圖使用​​本地柔性序列化/反序列化過程來保存/加載工作區在flex中的狀態。爲了保存或加載文件,我必須使用我的servlet,它只是將輸入流中的字節反彈回輸出流。下面是我的Flex代碼基本輪廓:FileReference和registerClassAlias

序列化對象容器:

public class MyWorkspace { 
    public var id : String; 
    public var url : String; 
    public var objectCollection : ArrayCollection; // Contains MySubObjects 
} 

序列化的子對象:

public class MySubObject 
{ 
    public var name:String; 
    public var csv:String; 
} 

視覺元素構造:

public function VisualSandbox(){ 
    registerClassAlias("MyWorkspaceAlias", MyWorkspace); 
    registerClassAlias("MySubObjectAlias", MySubObject); 
} 

視覺元素事件處理函數:

public function onSaveButtonClick(event : MouseEvent) : void 
{ 
    var ws : MyWorkspace = new MyWorkspace(); 
    ws.id = "ID"; 
    ws.url = "URL"; 
    ws.objectCollection = new ArrayCollection(veObjCollectionAC.source.slice()); 

    var ba : ByteArray = new ByteArray(); 
    ba.writeObject(ws); 
    ba.position = 0; 

    var fr : FileReference = new FileReference(); 
    // There's no need for me to put the rest so 
    ... 
    fr.download(urlRequest, "workspace.ws"); 
} 

public function onLoadButtonClick(event : MouseEvent) : void 
{ 
    veFileReference = new FileReference(); 
    veFileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, loadCompleteHandler); 
    // This part works as well so I'm skipping it. 

} 

public function loadCompleteHandler(event : DataEvent) : void 
{ 
    // Pretend I loaded "workspace.ws" by bouncing it off of my servlet byte for byte. 
    var ba : ByteArray = new ByteArray(); 
    ba.writeObject(event.data); 
    ba.position = 0; 
    var obj : * = ba.readObject(); 
    trace(obj is MyWorkspace); // Prints false 
} 

所以我這裏的問題是不與保存工作區。這很好。我的問題是加載工作區。我寫入字節數組的event.data不會被重新組合到MyWorkspace對象中,即使它正是我寫入文件的東西。

必須有一種從數據製作MyWorkspace對象的方法,但我無法弄清楚。有沒有人試圖做到這一點?

謝謝!

回答

1

我已經想出了這裏的問題。它具體與該行有關:

ba.writeObject(event.data); 

該事件的數據字段是DataEvent,具體是String類型。 ByteArray.writeObject()在字節數組的開頭放置一個類型代碼。這讓我花了好幾個小時的時間來看Hexplorer來弄清楚爲什麼字節數組在開始時有2-3個額外的字符。

這個我目前最好的解決辦法是改變該行如下:

for (var i : int = 0; i < event.data.length; ++i) 
{ 
    ba.writeByte(event.data.charCodeAt(i)); 
} 

這可確保字節數組是完全一樣的東西保存到本地驅動器和彈開我的servlet。

完成此操作後,trace(obj是MyWorkspace)將打印爲true。

希望這可以幫助別人在未來!

0

您是否嘗試過鑄造該值?

var obj : MyWorkspace = ba.readObject() as MyWorkspace; 
+0

是的。它會拋出一個轉場異常。 – AdamR 2010-07-15 15:44:35

+0

確切的錯誤是什麼? – JeffryHouser 2010-07-15 16:25:03

+0

TypeError:錯誤#1034:類型強制失敗:無法將「整個文件內容」轉換爲MyWorkspace – AdamR 2010-07-15 16:35:17