【问题标题】:Type preservation failing with RemoteClassRemoteClass 类型保存失败
【发布时间】:2012-10-11 21:30:42
【问题描述】:

考虑以下示例数据类:

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

【问题讨论】:

    标签: actionscript-3 apache-flex


    【解决方案1】:

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

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

    【讨论】:

    • cookbooks.adobe.com/…。此外,像这样铸造它的效果完全相同。问题是在序列化时类型会丢失;它无法通过任何方式施放来恢复。
    • 我不知道共享对象是以 AMF 格式存储的。我无法找到以任何方式复制的信息。我检查了我的一些旧代码;我正在创建一个新的对象实例并手动复制存储在共享对象中的属性。
    • 哦,我刚刚发现另一个例子,我在上面投射它。唯一的区别是我在 RemoteClass 元数据中指定了一个别名。
    • 添加别名似乎没有任何区别。此外,编译器似乎确实知道如何处理元数据标签,因为将 [Deprecated] 添加到方法确实会导致警告。然而,看起来你的铸造方式确实有所作为。现在我不再收到错误,但它总是返回 null...
    • 我不知道为什么它对我有用;但不适合你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多