2010-07-15 2 views
0

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); 

이벤트의 데이터 필드는 구체적으로 String 유형입니다. ByteArray.writeObject()는 바이트 배열의 시작 부분에 형식 코드를 저장합니다. 이로 인해 Hexplorer를 보면서 몇 시간 만에 바이트 배열의 시작 부분에 2-3 자 밖에없는 이유를 알 수있었습니다.

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

이 바이트 배열은 정확히 내 로컬 드라이브에 저장 내 서블릿을 튕겨 된 것과 동일하게 유지 : 이것에 대한

나의 현재 가장 좋은 방법은 다음과 같이 해당 행을 변경하는 것입니다.

이렇게하면 trace (obj가 MyWorkspace 임)가 true를 인쇄합니다.

앞으로 도움이되기를 바랍니다.

0

값을 전송하려고 시도 했습니까?

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

예. 캐스팅 예외가 발생합니다. – AdamR

+0

정확한 오류 란 무엇인가요? – JeffryHouser

+0

TypeError : 오류 # 1034 : 형식 강제 변환에 실패했습니다 : "전체 파일 내용을 여기"MyWorkspace로 변환 할 수 없습니다 – AdamR

관련 문제