使用SharedObject保存对象后无法调用对象内函数的问题求助
这问题我之前也踩过坑,核心原因很直白:SharedObject只能序列化可持久化的基本数据类型,函数引用根本没法被序列化保存——当你把带函数的对象存入SharedObject时,函数部分会被自动丢弃,重新加载后自然找不到这个函数了。
给你一套可行的解决方案,核心思路是保存函数的标识(比如名字)而非直接保存引用,加载后再把标识映射回实际函数:
步骤1:修改对象结构,保存函数名字符串
别直接存函数引用,改成把函数的名字以字符串形式存在对象里:
// 全局变量 var master = { myArray: [] }; function createMyObject():Object { // 用funName存函数名,代替直接写fun: myFunctionInMain return { name:"myObject", funName:"myFunctionInMain" }; } // 将对象推入数组 master.myArray.push(createMyObject());
步骤2:正常保存到SharedObject
这一步和你之前的操作一致,现在对象里只有字符串和基本类型,能正常被序列化:
var so = SharedObject.getLocal("myAppData"); so.data.master = master; // 执行保存 var flushStatus = so.flush(); if (flushStatus == SharedObjectFlushStatus.PENDING) { // 处理用户授权的情况(如果需要) }
步骤3:加载后映射函数引用
从SharedObject加载数据后,遍历你的数组,把每个对象的funName映射回Main.as里的实际函数:
var so = SharedObject.getLocal("myAppData"); if (so.data.master) { var loadedMaster = so.data.master; // 遍历数组,恢复函数引用 for each (var obj:Object in loadedMaster.myArray) { // 假设myFunctionInMain是Main类的公共方法,这里用this(如果在Main类内部执行这段代码) // 如果是静态方法,用 Main[obj.funName] // 如果是全局函数,用 window[obj.funName](浏览器环境下) obj.fun = this[obj.funName]; } // 现在就可以正常调用了! loadedMaster.myArray[0].fun(); }
额外注意事项
- 确保
funName对应的函数是可访问的:如果是类的私有方法,你需要改成公共方法,或者提供一个专门的函数来获取对应方法的引用。 - 如果有多个不同的函数,要保证函数名唯一,避免映射错误。
- 如果你的函数依赖特定的上下文(比如
this指向),加载后可能需要用Function.call()或Function.apply()来绑定正确的上下文,比如:// 调用时绑定Main实例作为上下文 loadedMaster.myArray[0].fun.call(this);
内容的提问来源于stack exchange,提问作者randyHurd
相关产品推荐
相关产品推荐

