我无法弄清楚这个人,所以你们可以帮助我。
我以一个充满对象的数组的形式存储一些数据,在这个示例卡片中。
在我的主要课程中,我有以下代码:
deckSprite.savedData = SharedObject.getLocal("cardsdata");
deckSprite.savedData.data.savedArray = deckSprite.deckArr;
deckSprite.savedData.flush();
trace(deckSprite.savedData.data.savedArray);
跟踪将输出类似[对象卡1,对象卡2,对象卡3]
的内容现在在一个名为" deckSprite"的静态类中我有这个:
savedData = sharedObject.getLocal("cardsdata");
if (savedData.data.savedArray == undefined)
{
trace("no save yet");
}
{
else
{
trace("save loaded");
deckArr = savedData.data.savedArray;
trace(savedData.data.savedArray);
现在我的追踪数据仅为"," (不知怎的,卡片已经消失了。)
现在我收到保存的数据后,我重新启动我的应用程序,每当他试图访问deckArr时,它崩溃就会给我错误"一个术语未定义且没有属性"。
当我保存阵列时它怎么可能保存阵列中的所有卡片,当我重新启动应用程序时,它突然只是" ,,"但卡片已经消失了?
答案 0 :(得分:0)
在AS3中序列化对象时,您必须使用程序包registerClassAlias()
中的flash.net
注册其类。所以你必须打电话给
registerClassAlias('com.example.deck', Deck)
在任何保存或加载发生之前,程序中的。
的完整参考资料 注意:正如@BadFeelingAbout在评论中指出的那样,您必须在Deck
中注册所有引用的课程,即如果您的套牌如下:
class Deck {
var firstCard:Card;
var type:DeckType;
}
能够将Deck
保存到SharedObject
您必须致电
registerClassAlias('com.example.deck', Deck);
registerClassAlias('com.example.card', Card);
registerClassAlias('com.example.decktype', DeckType);
在完成任何保存/加载之前。
修改强>
一切都取决于阵列的内容 如果我假设,您的deckSprite声明如下:
var deck1:Deck = new Deck();
var deck2:Deck = new Deck();
var deckArr:Array = new Array(deck1, deck2);
var deckSprite:DeckSprite = new DeckSprite()
deckSprite.setDeckArr(deckArr);
然后在将deckArray
添加到SharedObject
之前,您必须致电registerClassAlias()
。您的保存代码将如下所示:
registerClassAlias('com.example.deck', Deck);
deckSprite.savedData = SharedObject.getLocal("cardsdata");
deckSprite.savedData.data.savedArray = deckSprite.deckArr;
deckSprite.savedData.flush();
trace(deckSprite.savedData.data.savedArray);
(将Deck
替换为您用于代表甲板的实际类别)
同样,在进行任何加载之前必须调用第一行。
当然最好不要重复自己,所以你应该只在你的程序中调用registerClassAlias('com.example.deck', Deck);
一次,所以例如在你的主类的某些init()
方法中,如果你有这样的东西