3

Flash 的LocalConnection机制对传递给send(). 我遇到了一种情况,我需要发送一个复杂的对象,但最终可能会太大。

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

有没有办法在将对象传递给发送之前确定它的大小?如果是这样,我可以使用它进行一些快速计算,然后以最佳方式分解对象(或者如果它足够小则直接发送)。

4

2 回答 2

1

我找到了一种方法,可以在将对象发送到 LocalConnection 之前至少估计其大小,方法是使用数据构造一个临时 SharedObject。由于 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

于 2009-11-02T16:39:27.933 回答
0

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

“如果您需要将大量文本或 XML 对象作为字符串发送,您将很快遇到这个天花板。我想我会分享对 LocalConnection 的一些修改,它可以让您发送几乎无限的字符串。它只是分裂将它们添加到尽可能多的“发送”语句中,以使它们都保持在 40K 以下。”

它将确保发送的每个段都在强加的限制之下,而无需知道大小。

于 2009-10-29T21:55:59.453 回答