Actionscript 3 Actionscript 3 Flex 4.5序列化/反序列化问题?
在Flex 4.5 Mobile项目中,我遇到了一个反序列化对象的特殊问题。我已经连接到一个Webservice fine并填充了一个ListBox fine。我可以选择该项并获得详细信息,但是在序列化对象并尝试反序列化它之后;对象定义在某处丢失 当用户在列表中选择请求时,我有一个变量Actionscript 3 Actionscript 3 Flex 4.5序列化/反序列化问题?,actionscript-3,flex4,flash-builder,Actionscript 3,Flex4,Flash Builder,在Flex 4.5 Mobile项目中,我遇到了一个反序列化对象的特殊问题。我已经连接到一个Webservice fine并填充了一个ListBox fine。我可以选择该项并获得详细信息,但是在序列化对象并尝试反序列化它之后;对象定义在某处丢失 当用户在列表中选择请求时,我有一个变量 private var selectedReq:ServiceRequest; //Here we instantiate the local variable when user select id in Li
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<>
如果我不将readServiceRequest()强制转换为ServiceRequest,只返回一个对象;我可以遍历对象,并从序列化对象返回正确的值
我只能假设Flex从Webservice创建的类可能导致了这种情况?如果写入的是值,而不是对象类型,那么序列化过程中会丢失一些内容-正确吗
对于所有的细节我都很抱歉,但我现在有点不知所措……任何帮助都将不胜感激
RL
var objReq:ServiceRequest=readServiceRequest()作为ServiceRequest代码>
上面的行将继续返回null
我敢打赌,如果您以以下方式修改它:
var-objReq:ServiceRequest=ServiceRequest(readServiceRequest())代码>
您将得到一个运行时异常,其消息类似于“无法将ObjectProxy强制转换为ServiceRequest”
如果是这种情况,那么得到这种结果的原因是AMF序列化程序在序列化ServiceRequest实例时没有保留类型信息
为了解决这个问题,您需要在序列化/反序列化之前调用
flash.net.registerClassAlias(“full.qualified.name.ServiceRequest”,ServiceRequest)代码>var objReq:ServiceRequest=readServiceRequest()作为ServiceRequest代码>
上面的行将继续返回null
我敢打赌,如果您以以下方式修改它:
var-objReq:ServiceRequest=ServiceRequest(readServiceRequest())代码>
您将得到一个运行时异常,其消息类似于“无法将ObjectProxy强制转换为ServiceRequest”
如果是这种情况,那么得到这种结果的原因是AMF序列化程序在序列化ServiceRequest实例时没有保留类型信息
为了解决这个问题,您需要在序列化/反序列化之前调用
flash.net.registerClassAlias(“full.qualified.name.ServiceRequest”,ServiceRequest)代码>在发布问题之前没有登录,这是我的错
我确实使用了registerClassAlias,但这没有帮助。我确实在Adobe论坛上发现了其他simular问题,不断的反馈是,问题最有可能是由于对象类在文件写入过程中失去了属性造成的,原因是类对象是在从Webservice创建数据源时写入的。由于我最初的问题,我们决定使用SQLite,它工作得非常好-感谢您的帮助
RL我很抱歉在发布问题之前没有登录
我确实使用了registerClassAlias,但这没有帮助。我确实在Adobe论坛上发现了其他simular问题,不断的反馈是,问题最有可能是由于对象类在文件写入过程中失去了属性造成的,原因是类对象是在从Webservice创建数据源时写入的。由于我最初的问题,我们决定使用SQLite,它工作得非常好-感谢您的帮助
RL试试看这是否有效
检查事件结果是否为ByteArray
将event.result读取/存储为ByteArray。
var byteArray:byteArray=event.result作为byteArray代码>
使用readObject()函数获取/反序列化对象。
var-object:object=byteArray.readObject()代码>
强制转换为目标对象类型。您的案例中的ServiceRequest。
var tartgetedobject:ServiceRequest=对象作为ServiceRequest代码>
或
var tartgettedObject:ServiceRequest=ServiceRequest(对象)代码>
试试看这是否管用
检查事件结果是否为ByteArray
将event.result读取/存储为ByteArray。
var byteArray:byteArray=event.result作为byteArray代码>
使用readObject()函数获取/反序列化对象。
var-object:object=byteArray.readObject()代码>
强制转换为目标对象类型。您的案例中的ServiceRequest。
var tartgetedobject:ServiceRequest=对象作为ServiceRequest代码>
或
var tartgettedObject:ServiceRequest=ServiceRequest(对象)代码>
非常确定您不能像返回的对象只是作为动态对象的类型转换那样对其进行类型转换。非常确定您不能像返回的对象只是作为动态对象的类型转换那样对其进行类型转换。这是非常不令人满意的结果-无法确定确切的问题是什么。我仍然认为我的答案是正确的,这种行为的原因是AMF序列化程序跳过了类型信息。很可能您没有正确使用registerClassAlias。另一种方法是使用[RemoteClass]
-metadata标记对类进行注释。看看这个-你应该能够重现你的问题。这是非常不令人满意的结果-无法确定确切的问题是什么。我仍然认为我的答案是正确的,这种行为的原因是AMF序列化程序跳过了类型信息。很可能您不使用registerClassAlias cor
//This line is null but the file exist and the object was written
var objReq:ServiceRequest = readServiceRequest() as ServiceRequest;
if(objReq) {
selectedReq = objReq;
}