【问题标题】:Actionscript 3 Flex 4.5 Serialization/Deserialization issue?Actionscript 3 Flex 4.5 序列化/反序列化问题?
【发布时间】:2011-09-08 03:46:00
【问题描述】:

我在反序列化 Flex 4.5 Mobile 项目中的对象时遇到了特殊问题。我已经很好地连接到了 Web 服务并很好地填充了 ListBox。我也可以选择项目并获取详细信息,但是在序列化对象并尝试反序列化它之后;对象定义在某处丢失。

当用户在列表中选择请求时,我有一个变量

private var selectedReq:ServiceRequest;
//Here we instantiate the local variable when user select id in ListBox
selectedReq = event.currentTarget.selectedItem as ServiceRequest;           

用户选择保存的每个服务请求都会调用此方法。

            private function writeServiceRequest():void {
            var filename:String = buildFileName();

            var file:File = File.applicationStorageDirectory.resolvePath(filename);
            if (file.exists)
                file.deleteFile();
            var fileStream:FileStream = new FileStream();
            fileStream.open(file, FileMode.WRITE);

//selectedReq is the private var of the users selected item
            fileStream.writeObject(selectedReq); 
            fileStream.close();
        }

当用户想要查看请求时,调用此方法。

        private function readServiceRequest():ServiceRequest {
            var filename:String = buildFileName();
            var file:File = File.applicationStorageDirectory.resolvePath(filename);
            if (!file.exists) {
                return null;
            }

            var fileStream:FileStream = new FileStream();
            fileStream.open(file, FileMode.READ);
            var objReq:ServiceRequest = fileStream.readObject() as ServiceRequest;

            fileStream.close();

            return objReq;
        }

类对象类似于。

public var id:uint;
public var requisitioner:String;
public var requestItems:ArrayCollection //Webservice it's actually List<requestItems>
public var requestProcesses:ArrayCollection // WSDL it's actually List<>

当我尝试读取/反序列化时

                 //This line is null but the file exist and the object was written
            var objReq:ServiceRequest = readServiceRequest() as ServiceRequest;

            if(objReq) {
                selectedReq = objReq;
            }

如果我不将 readServiceRequest() 转换为 ServiceRequest 并简单地返回一个对象;我可以遍历 Object 并获得从序列化对象返回的正确值。

我只能假设 Flex 从 Web 服务创建的类可能会导致这种情况?如果值被写入而不是对象类型,那么在序列化中必须丢失一些东西 - 对吗?

抱歉所有细节,但我此时有点迷失......任何帮助将不胜感激。

强化学习

【问题讨论】:

  • 很确定你不能像返回的对象只是类型转换为动态对象那样类型转换它。

标签: actionscript-3 flex4 flash-builder


【解决方案1】:

var objReq:ServiceRequest = readServiceRequest() as ServiceRequest;

以上行会继续返回null。

我敢打赌,如果你按以下方式修改它:

var objReq:ServiceRequest = ServiceRequest(readServiceRequest());

您将收到运行时异常,并显示类似于 Can't cast ObjectProxy to ServiceRequest

的消息

如果是这种情况,那么您得到这个的原因是因为 AMF 序列化程序在序列化 ServiceRequest-实例时不保留类型信息。

为了解决这个问题,您需要在序列化/反序列化之前调用flash.net.registerClassAlias()

flash.net.registerClassAlias("fully.qualified.name.ServiceRequest", ServiceRequest);

【讨论】:

    【解决方案2】:

    试试这个是否可行。

    1. 检查event.result 是否为ByteArray

    2. 将 event.result 读取/存储为 ByteArray。 var byteArray:ByteArray = event.result as ByteArray;

    3. 使用 readObject() 函数获取/反序列化对象。 var object:Object = byteArray.readObject();

    4. 转换为目标对象类型。 ServiceRequest 在您的情况下。 var tartgettedObject:ServiceRequest = object as ServiceRequest; 或者 var tartgettedObject:ServiceRequest = ServiceRequest(object);

    【讨论】:

      【解决方案3】:

      在发布问题之前没有登录是我的错。

      我确实使用了没有帮助的 registerClassAlias。我确实在 Adob​​e 论坛上发现了其他类似的问题,并且不断的反馈是该问题很可能是由对象类在文件写入过程中丢失其属性引起的,原因是类对象是在从 Web 服务创建数据源时写入的。由于我最初的问题,我们决定使用运行良好的 SQLite - 感谢您提供的所有帮助。

      强化学习

      【讨论】:

      • 这是非常不令人满意的结果 - 无法确定确切的问题。我仍然认为我的回答是有效的,这种行为的原因在于 AMF 序列化程序跳过了类型信息。您很可能没有正确使用 registerClassAlias。另一种方法是使用[RemoteClass]-metadata 标记来注释您的类。看看这个this tutorial - 你应该能够重现你的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2013-12-25
      • 2017-11-20
      相关资源
      最近更新 更多