Flash 的LocalConnection
机制对传递给send()
. 我遇到了一种情况,我需要发送一个复杂的对象,但最终可能会太大。
我可以将对象分解为多个较小的对象,但我想以一种有效的方式这样做。我最终可能会收到数百个较小的对象,我不想单独发送每个对象。此外,每个对象都可以是任意大小,所以我不能只选择一些数字来对它们进行分组。
有没有办法在将对象传递给发送之前确定它的大小?如果是这样,我可以使用它进行一些快速计算,然后以最佳方式分解对象(或者如果它足够小则直接发送)。
Flash 的LocalConnection
机制对传递给send()
. 我遇到了一种情况,我需要发送一个复杂的对象,但最终可能会太大。
我可以将对象分解为多个较小的对象,但我想以一种有效的方式这样做。我最终可能会收到数百个较小的对象,我不想单独发送每个对象。此外,每个对象都可以是任意大小,所以我不能只选择一些数字来对它们进行分组。
有没有办法在将对象传递给发送之前确定它的大小?如果是这样,我可以使用它进行一些快速计算,然后以最佳方式分解对象(或者如果它足够小则直接发送)。
我找到了一种方法,可以在将对象发送到 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);
}
我正在修改我的发送代码,以便在发送之前在可能太大的数组上调用它,然后分别发送每个“拆分”数组。然后在我的接收代码中,我重新组合它们并使用组合数据引发单个事件。
我现在在这里保持更新(带有文档):
我不是 100% 确定,但 Ultrashock 上的这篇文章看起来与您需要的相似:http ://www.ultrashock.com/forums/actionscript/40k-byte-size-limit-on-localconnection-56395.html
“如果您需要将大量文本或 XML 对象作为字符串发送,您将很快遇到这个天花板。我想我会分享对 LocalConnection 的一些修改,它可以让您发送几乎无限的字符串。它只是分裂将它们添加到尽可能多的“发送”语句中,以使它们都保持在 40K 以下。”
它将确保发送的每个段都在强加的限制之下,而无需知道大小。