Flex:从损坏的本地SharedObject恢复

时间:2012-03-29 13:32:23

标签: flex recovery corrupt shared-objects

我的Flex应用使用本地SharedObjects。例如,由于插件崩溃,已经发生Flash cookie损坏的事件。在这种情况下,SharedObjects.getLocal将抛出异常(#2006)。

我的客户希望应用程序正常恢复:如果cookie已损坏,我应该用空的替换它。

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

如何删除或替换此类Cookie?

非常感谢!

编辑:

没有太多要显示的代码 - 我访问本地cookie,我可以很容易地捕获异常。但是,一旦我发现异常,如何在同一位置创建一个新的共享对象?

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

通过使用编辑器破坏Flash cookie的二进制内容,可以轻松复制错误。

2 个答案:

答案 0 :(得分:0)

您需要测试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");

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

答案 1 :(得分:0)

我不确定为什么你会收到范围错误 - 尤其是如果你报告可以找到它。我对此类事情的唯一猜测是,跨域策略可能会跨越边界。假设IT可以控制托管服务器的位置,如果子域发生了变化甚至是访问类型(从标准到https),这可能会导致问题,特别是在应用程序正在进行的情况下(已通过多个版本)。我会发现很难相信您正在尝试检索已经由另一个应用程序命名的命名SO - 实质上是名称冲突。在这方面,我们中的许多人仍然使用反向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.
}