0

考虑以下示例数据类:

[RemoteClass]
public class SOTestData {
    public var i:int;
    public function SOTestData(i:int) {
        this.i = i;
    }   
}

据我了解,RemoteClass 元数据标记应确保当此类的对象被重新初始化时,类型信息被保留。

我使用以下程序进行测试:

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 中没有存储类型信息。

我认为我没有错误地使用元数据,可能是编译器不知道如何处理它?我没有收到任何编译器错误/警告,尽管当我使用一些不存在的标签时它也不会抱怨。我正在使用带有 FlashDevelop 的 Flex 4.6 SDK 作为 IDE。

编辑:

下面是共享对象。如您所见,类型保存为“对象”而不是实际类型。

so = [object #2, class 'SharedObject'] {
  data: [object #0, class 'Object'] {
    object: [object #1, class 'Object', dynamic 'False', externalizable 'False'] {
      i: 15,
    },
  }
}
4

1 回答 1

2

我只使用 RemoteClass 进行 AMF RemoteObject 调用;我不认为它与共享对象有任何关系。根据文档

使用 [RemoteClass] 元数据标记向 Flex 注册类,以便 Flex 在使用操作消息格式 (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();
    }   

最后,加载对象的代码:

    public static function getUserVO():UserVO{
        var userSharedObject :SharedObject = SharedObject.getLocal('userVO')
        if(userSharedObject.size <=0){
            return null;
        }
        return userSharedObject.data.userVO as UserVO;

    }

这与原始海报的代码之间唯一明显的区别是我在 RemoteClass 元数据中指定了一个别名。

于 2012-10-11T21:53:45.660 回答