首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileReference和registerClassAlias

FileReference和registerClassAlias
EN

Stack Overflow用户
提问于 2010-07-15 23:04:15
回答 2查看 639关注 0票数 0

我正在尝试使用原生flex序列化/反序列化过程在flex中保存/加载工作区的状态。为了保存或加载文件,我必须使用我的servlet,它只是将输入流中的字节返回到输出流。下面是我的Flex代码的基本概要:

序列化对象容器:

代码语言:javascript
复制
public class MyWorkspace {
    public var id : String;
    public var url : String;
    public var objectCollection : ArrayCollection; // Contains MySubObjects
}

序列化的子对象:

代码语言:javascript
复制
public class MySubObject
{
    public var name:String;
    public var csv:String;
}

可视化元素构造函数:

代码语言:javascript
复制
public function VisualSandbox(){
    registerClassAlias("MyWorkspaceAlias", MyWorkspace);
    registerClassAlias("MySubObjectAlias", MySubObject);
}

视觉元素事件处理程序:

代码语言:javascript
复制
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对象的方法,但是我不知道该怎么做。以前有没有人尝试过这样做?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-16 03:21:03

我已经知道问题出在哪里了。它特别与这一行有关:

代码语言:javascript
复制
ba.writeObject(event.data);

该事件的数据字段是一个DataEvent,其类型明确为String。ByteArray.writeObject()将类型代码放在字节数组的开头。我花了很多时间查看Hexplorer,才弄清楚为什么字节数组的开头有2-3个额外的字符。

我目前最好的解决方案是按如下方式更改该行:

代码语言:javascript
复制
for (var i : int = 0; i < event.data.length; ++i)
{
    ba.writeByte(event.data.charCodeAt(i));
}

这确保字节数组与保存到本地驱动器并从servlet中弹出的字节数组完全相同。

这样做之后,trace(obj为MyWorkspace)输出true。

希望这对将来的其他人有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2010-07-15 23:30:25

你有没有试过转换这个值?

代码语言:javascript
复制
    var obj : MyWorkspace = ba.readObject() as MyWorkspace;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3256897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档