1

sharedObject データの保存と取得に問題があります。

たとえば、共有オブジェクトを作成すると:

var myData:SharedObject = SharedObject.getLocal("myData");

次に、オブジェクトを作成します。この場合は、"feathers" listcollection オブジェクトです。

var lc:ListCollection = new ListCollection()

次に割り当てます。

myData.data.lc = lc;

さて、電話を再起動せずに(私はAndroidで作業しています)、保存したlistCollectionをlistCollection varに割り当てると、次のように正常に動作します。

var lc:ListCollection = myData.data.lc as ListCollection;

しかし、電話を再起動してこれを行うと:

var lc:ListCollection = myData.data.lc as ListCollection;

キャストしても「ListCollection」として認識されません。「オブジェクト」として保存されたと表示されます

したがって、基本的には、再起動によって dataType を保存していません。しかし、再起動する前にロードすると動作します...

SharedObject が機能しない理由はありますか? 典型的なオブジェクトでうまく機能します。データをローカルに保存して取得するより良い方法はありますか? なぜデータ型を変更するのですか?

4

4 に答える 4

1

registerClassAlias()共有オブジェクトを取得および設定する前に呼び出します。

マニュアル

于 2013-02-13T05:07:07.957 に答える
1

SharedObject データに関する AS3 lang ref:

各属性は、Array、Number、Boolean、ByteArray、XML など、任意の ActionScript または JavaScript タイプのオブジェクトにすることができます。たとえば、次の行は、共有オブジェクトのさまざまな側面に値を割り当てます。

ByteArrayを使用してみてください。SOでオブジェクトを書き込む方法:

            var list:ArrayList = new ArrayList(["test"]);
            var buffer:ByteArray = new ByteArray();
            buffer.writeObject(list);
            buffer.position = 0;

            var mySo:SharedObject = SharedObject.getLocal("application");
            mySo.data.list = buffer;
            mySo.flush();

そして、オブジェクトを読み取ります:

            var mySo:SharedObject = SharedObject.getLocal("application");
            var buffer:ByteArray = mySo.data.list;
            var result:ArrayList = ArrayList( buffer.readObject() );

カスタム クラスについては、registerClassAlias を使用します。Vesperのコメントを参照してください。

于 2013-02-13T15:55:49.167 に答える
0

SharedObject が型情報を保存するとは考えていません。これを回避する最善の方法は、独自のシリアライゼーション デシリアライズ プロセスを作成することです。

オブジェクトを格納するために他の形式を使用することにした場合に備えて、とにかくオブジェクトを非ネイティブ実装として変換するメソッドを持つことはおそらく良い考えです。ネイティブ JSON エンコーディング/解析では、それを行わない理由はありません (さらに、何を書くかを決定するか決定しないかを決めることができます) - SharedObject がクラス情報を保存したとしても、プライベート変数をどのように決定しますか?

すなわち:

SerializableListCollection extends ListCollection {

  public function serialize():Object {
     var children:Array = [];

     // loop and add children
     children.push(child.serialize());

     return {
        children: children;
     }
  }
}

次に、 JSON::stringify(ListCollection.serialize()) を保存して、実装に縛られない方法でデータを保存できます。

于 2013-02-13T05:40:29.340 に答える