1

我在保存,然后检索 sharedObject 数据时遇到问题。

例如,如果我创建一个共享对象:

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

然后,我制作了一个对象,在这种情况下,是一个“羽毛”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”。它说它被保存为“对象”

所以基本上它不是通过重启来保存数据类型。但是,如果我在重新启动之前加载它,它就可以工作......

任何想法为什么 SharedObject 不起作用?它适用于典型对象。有没有更好的方法可以在本地保存数据并检索它?为什么要更改数据类型?

4

4 回答 4

1

registerClassAlias()在获取和设置共享对象之前调用。

手动的

于 2013-02-13T05:07:07.957 回答
1

AS3 lang ref 关于 SharedObject 数据:

每个属性都可以是任何 ActionScript 或 JavaScript 类型的对象 — Array、Number、Boolean、ByteArray、XML 等等。例如,以下行将值分配给共享对象的各个方面:

尝试使用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 会保存任何类型信息,解决这个问题的最好方法是创建自己的序列化反序列化过程——我相信 SharedObject 会通过对象进行简单的深度迭代,并尝试对其进行序列化。

无论如何,最好有一个方法可以将您的对象转换为非本地实现,以防您决定使用其他格式来存储您的对象。使用本机 JSON 编码/解析——没有理由不这样做(另外,你可以决定或不决定写什么)——即使 SharedObject 确实保存了类信息,它如何确定私有变量?

IE:

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 回答
0

您必须myData.flush()在将所有数据分配给myData.

于 2014-03-29T14:47:41.943 回答