Flash的LocalConnection
机制对传递给send()
的各个邮件的大小限制为40k。我遇到了一个我需要发送的复杂对象的情况,这可能会导致太大。
我可以将对象分解为多个较小的对象,但我想以有效的方式这样做。有可能我最终会得到数百个较小的物体,而且我不想单独发送每个物体。此外,每个对象可以是任意大小,所以我不能只选择一些数字来对它们进行分组。
在将对象传递给发送之前,有没有办法确定对象的大小?如果是这样,我可以使用它来做一些快速计算,然后在某种程度上最佳地分解对象(或者只要它足够小就直接发送)。
答案 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);
}
我正在修改我的发送代码,以便在它发送之前在可能太大的数组上调用它,然后分别发送每个“拆分”数组。然后在我的接收代码中,我重新组合它们并使用组合数据提出单个事件。
我现在保持更新(带文档):
答案 1 :(得分:0)
我不是百分百肯定,但是Ultrashock上的这篇文章看起来与你需要的相似:http://www.ultrashock.com/forums/actionscript/40k-byte-size-limit-on-localconnection-56395.html
“如果你需要发送大段文章 你可以将text或XML对象作为字符串 会很快碰到这个 天花板。我以为我会分享一点 对LocalConnection的修改 让你发送几乎无限的 字符串。它简单地将它们分成两部分 尽可能多的“发送”声明 对于他们所有人都保持在40K以下。“
这将确保发送的每个分段都处于强制限制之下,而无需知道大小。