考虑以下示例数据类:
[RemoteClass]
public class SOTestData {
public var i:int;
public function SOTestData(i:int) {
this.i = i;
}
}
据我所知,RemoteClass元数据标签应该确保当这个类的对象被sialial化时,类型信息被保留。
我使用以下程序进行测试:
public class SOTest extends Sprite {
public function SOTest() {
var data:SharedObject = SharedObject.getLocal("SOTest");
if (data.data.object) {
try {
var stored:SOTestData = data.data.object;
trace(stored.i);
} finally {
data.clear();
}
}
else {
data.data.object = new SOTestData(15);
data.flush();
}
}
}
这里第一次运行写入数据,秒读取和清除。运行这个,我仍然得到一个类转换错误。实际上,在SharedObject中没有存储类型信息。
我不认为我使用的是元数据错误,可能是因为编译器不知道如何处理它?我没有得到任何编译器错误/警告,虽然当我使用一些不耐烦的标签时,它也不会抱怨。我正在使用Flex 4.6 SDK和FlashDevelop作为IDE。
修改
以下是共享对象。如您所见,类型保存为“对象”而不是实际类型。
so = [object #2, class 'SharedObject'] {
data: [object #0, class 'Object'] {
object: [object #1, class 'Object', dynamic 'False', externalizable 'False'] {
i: 15,
},
}
}
答案 0 :(得分:2)
我只使用RemoteClass进行AMF RemoteObject调用;我不认为它与共享对象有任何关系。根据{{3}}
使用[RemoteClass]元数据标签向Flex注册类 Flex类在类实例时保留类型信息 使用Action Message Format(AMF)序列化。你插入 ActionScript类定义之前的[RemoteClass]元数据标记。 [RemoteClass]元数据标记具有以下语法:
从我提供的代码中可以看出,您没有以AMF格式序列化对象。
我相信你的课堂演员错误是因为你没有投你的课。共享对象总是作为通用对象返回。试试这个:
var stored:SOTestData = data.data.object as SOTestData ;
以下是我使用的应用程序中的一些代码。首先是将在共享对象中序列化的值对象:
package com.login.vos
{
[RemoteClass(alias="com.login.vos.UserVO")]
public class UserVO
{
public function UserVO()
{
}
public var firstName :String;
public var lastName :String;
public var userID :Number;
}
}
保存对象的代码:
public static function saveUserVO(userVO:UserVO):void{
var userSharedObject :SharedObject = SharedObject.getLocal('userVO') ;
userSharedObject.data.userVO = userVO;
userSharedObject.flush();
}
最后,加载objecT的代码:
public static function getUserVO():UserVO{
var userSharedObject :SharedObject = SharedObject.getLocal('userVO')
if(userSharedObject.size <=0){
return null;
}
return userSharedObject.data.userVO as UserVO;
}
原始海报与代码之间唯一明显的区别是我在RemoteClass元数据中指定了一个别名。