我正在尝试使用原生flex序列化/反序列化过程在flex中保存/加载工作区的状态。为了保存或加载文件,我必须使用我的servlet,它只是将输入流中的字节返回到输出流。下面是我的Flex代码的基本概要:
序列化对象容器:
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对象的方法,但是我不知道该怎么做。以前有没有人尝试过这样做?
谢谢!
发布于 2010-07-16 03:21:03
我已经知道问题出在哪里了。它特别与这一行有关:
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。
希望这对将来的其他人有所帮助!
发布于 2010-07-15 23:30:25
你有没有试过转换这个值?
var obj : MyWorkspace = ba.readObject() as MyWorkspace;https://stackoverflow.com/questions/3256897
复制相似问题