使用RemoteClass进行类型保存失败

时间:2012-10-11 21:30:43

标签: actionscript-3 flex

考虑以下示例数据类:

[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,
    },
  }
}

1 个答案:

答案 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元数据中指定了一个别名。