Apache flex Flex:从损坏的本地SharedObject恢复

Apache flex Flex:从损坏的本地SharedObject恢复,apache-flex,recovery,corrupt,shared-objects,Apache Flex,Recovery,Corrupt,Shared Objects,我的Flex应用程序使用本地共享对象。例如,由于插件崩溃,Flash cookie出现了损坏的事件。在这种情况下,SharedObjects.getLocal将引发异常(#2006) 我的客户希望应用程序能够正常恢复:如果cookie已损坏,我应该将其替换为空cookie 问题是,如果SharedObject.getLocal不返回SharedObject的实例,我就没有什么可以调用clear()的 我如何删除或替换这样的cookie 非常感谢 编辑: 没有太多代码可以显示-我访问本地cooki

我的Flex应用程序使用本地共享对象。例如,由于插件崩溃,Flash cookie出现了损坏的事件。在这种情况下,SharedObjects.getLocal将引发异常(#2006)

我的客户希望应用程序能够正常恢复:如果cookie已损坏,我应该将其替换为空cookie

问题是,如果SharedObject.getLocal不返回SharedObject的实例,我就没有什么可以调用clear()的

我如何删除或替换这样的cookie

非常感谢

编辑:

没有太多代码可以显示-我访问本地cookie,并且可以轻松捕获异常。但是,一旦捕获到异常,如何在同一位置创建新的共享对象呢

 try {
     localStorage = SharedObject.getLocal("heywoodsApp");
 } catch (err:Error) {
       // what do I do here?
 }

通过使用编辑器破坏flashcookie的二进制内容,可以很容易地再现错误

您需要测试SharedObject的长度,如果是0,则重新创建。此外,始终使用flush写入对象。以下是我们用来计算软件启动次数的函数:

private function usageNumber():void {
    usage = SharedObject.getLocal("usage");

    if (usage.size > 0) {
       var usageStr:String = usage.data.usage;      
       var usageNum:Number = parseInt(usageStr);

       usageNum = usageNum + 1; 
       usageStr = usageNum.toString();

       usage.data.usage = usageStr;
       usage.flush();

       countService.send();

    } else {

       usage.data.usage = "1";
       usage.flush();

       countService.send();
    }

}
需要注意的是,如果对象不可用,它将自动重新创建。这就是SharedObjects令人困惑的地方

我们所做的只是全局声明变量:

public var usage:SharedObject;
然后在init()函数中调用它:

usage = SharedObject.getLocal("usage");

如果它不存在,那么它就会被创建

我不太清楚为什么会出现范围错误-尤其是如果您报告可以找到它的话。我唯一的猜测是,关于跨域策略,有可能跨越边界。假设它可以控制服务器的托管位置,如果子域曾经更改,甚至访问类型(从标准到https),这可能会导致问题,尤其是在应用程序正在运行的情况下(已通过多个版本)。我觉得很难相信您正在尝试检索一个已被另一个应用程序命名的名称-本质上是名称冲突。在这方面,我们中的许多人甚至在这些事情上仍然使用反向dns风格的命名约定

如果您可以捕获错误,那么从中恢复应该相对简单:-只需在try的作用域之外声明变量,这样也可以访问它。[编辑]:由于它是一个静态方法,您可能需要创建一个后缀,以使用新的标识符重新开始

var mySO:SharedObject;
....
catch(e:Error)
{
      mySO = SharedObject.getLocal('my.reversedns.so_name_temp_name');
      //might want to dispatch an error event or rethrow a specific exception
      //to alert the user their "preferences" were reset.
}

+问题1;但我一点也不知道解决办法是什么。你的应用程序在做什么,插件崩溃是很常见的?你能分享代码吗?你能分享完整的例外吗?我想知道您是否可以使用未捕获的异常事件创建一个全新的SharedObject?该应用程序是一个前端,用于监视和分析公司内部使用的业务数据。崩溃并不常见,但有报道称,Windows崩溃后出现了一个损坏的cookie,由于用户在技术上不够熟练,无法清理他们的Flash cookie,客户端请求提供一项功能(即,如果我这样做,我会得到更多的钱),如果事件再次发生,应用程序会为他们这样做。我将把代码放在原始注释中。@ThomasHeywood您是否以某种方式解决了这个问题?我在这里看不到任何好的答案:/n不,我们顺其自然地记录了这个问题。感谢您提供的精彩代码片段。不幸的是,这并不能解决我的问题。我从未得到SharedObject的实例(表示它的变量被赋值为null),因此没有任何东西可以调用length()(或flush(),等等)。好的,那么您在访问共享对象时遇到异常?是的。我调用SharedObject.getLocal(“myStorage”),它抛出RangeError,这是getLocal找到Flash cookie但无法检索它时的预期行为。所以我没有SharedObject的实例可以使用。更新了我的答案,说明了初始化的方式。我没有发现任何迹象表明会发生射程误差。另外,我应该指出,当我进行测试时,我会使用clear()来确保对象是新的。@ThomasHeywood为什么不检查null,然后在null时重新创建呢?这对你不管用吗?很明显,你会检查的,但我不得不问。