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 を IDE として Flex 4.6 SDK を使用しています。

編集:

以下は共有オブジェクトです。ご覧のとおり、型は実際の型ではなく「オブジェクト」として保存されます。

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

私は AMF RemoteObject 呼び出しを行うために RemoteClass のみを使用しました。共有オブジェクトとは何の関係もないと思いました。ドキュメントごと

[RemoteClass] メタデータ タグを使用して Flex にクラスを登録し、Action Message Format (AMF) を使用してクラス インスタンスをシリアル化するときに Flex が型情報を保持できるようにします。[RemoteClass] メタデータ タグを ActionScript クラス定義の前に挿入します。[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 メタデータでエイリアスを指定していることです。

于 2012-10-11T21:53:45.660 に答える