当数据对象可能大于40k时,避免使用LocalConnection的40k大小限制

时间:2009-10-28 18:49:40

标签: flash actionscript-2 localconnection

Flash的LocalConnection机制对传递给send()的各个邮件的大小限制为40k。我遇到了一个我需要发送的复杂对象的情况,这可能会导致太大。

我可以将对象分解为多个较小的对象,但我想以有效的方式这样做。有可能我最终会得到数百个较小的物体,而且我不想单独发送每个物体。此外,每个对象可以是任意大小,所以我不能只选择一些数字来对它们进行分组。

在将对象传递给发送之前,有没有办法确定对象的大小?如果是这样,我可以使用它来做一些快速计算,然后在某种程度上最佳地分解对象(或者只要它足够小就直接发送)。

2 个答案:

答案 0 :(得分:1)

我找到了一种方法,通过使用数据构造临时SharedObject,在将对象发送到LocalConnection之前至少估计对象的大小。由于SharedObject不会写入磁盘,因此即使不允许本地存储,它似乎也能正常工作。

这是我将用来确定大小的函数:

public static function getObjectSize(o:Object):Number {
  var so:SharedObject = SharedObject.getLocal("__getObjectSizeHelper");
  so.data.o = o;
  var size:Number = so.getSize();
  so.clear();
  return size;
}

我发送的消息太大,是复杂对象的数组。我将假设没有单个对象会太大(不是100%保证,但很可能没有用户会输入足够的数据来使它足够大,而现在忽略这种情况会使事情变得更简单)。鉴于这个假设,我会在发送之前检查数组。如果它太大我会将它分成两半并尝试这两个数组。我会继续递归地分成两半,直到我得到一组足够小的数组(最有可能的是我永远不需要超过1次分割,但如果我这样做只有2或3次)。

然后,阵列的每个部分都可以单独发送,并在通信通道的另一端重新组合。

这是我创建的用于将数组拆分为多个数组的代码,这些数组都足够小,可以发送:

public static function isTooBigForLC(o:Object):Boolean {
  return getObjectSize(o) > 35000;
}

public static function splitArrayForLC(a:Array):Array {
  if (!isTooBigForLC(a)) { return [a]; }

  if (a.length <= 1) {
    LOG.warn("individual object is too big for LocalConnection! Skipping");
    return [];
  }

  var mid:Number = Math.floor(a.length / 2);

  var left:Array = splitArrayForLC(a.slice(0, mid));
  var right:Array = splitArrayForLC(a.slice(mid));

  return left.concat(right);
}

我正在修改我的发送代码,以便在它发送之前在可能太大的数组上调用它,然后分别发送每个“拆分”数组。然后在我的接收代码中,我重新组合它们并使用组合数据提出单个事件。

我现在保持更新(带文档):

http://gist.github.com/224258

答案 1 :(得分:0)

我不是百分百肯定,但是Ultrashock上的这篇文章看起来与你需要的相似:http://www.ultrashock.com/forums/actionscript/40k-byte-size-limit-on-localconnection-56395.html

  

“如果你需要发送大段文章   你可以将text或XML对象作为字符串   会很快碰到这个   天花板。我以为我会分享一点   对LocalConnection的修改   让你发送几乎无限的   字符串。它简单地将它们分成两部分   尽可能多的“发送”声明   对于他们所有人都保持在40K以下。“

这将确保发送的每个分段都处于强制限制之下,而无需知道大小。