代码之家  ›  专栏  ›  技术社区  ›  Herms

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

  •  3
  • Herms  · 技术社区  · 15 年前

    LocalConnection 机制对传递给的单个消息有40k大小限制 send() . 我遇到了这样一种情况,我需要发送一个复杂的对象,它可能会太大。

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   Herms    15 年前

    我找到了一种方法,在将对象发送到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

        2
  •  0
  •   mindsharelabs    15 年前

    我不是100%确定,但这篇关于Ultrashock的帖子看起来与您需要的内容类似: http://www.ultrashock.com/forums/actionscript/40k-byte-size-limit-on-localconnection-56395.html

    文本或XML对象作为字符串 很快就会遇到这种情况 天花板我想我应该分享一点 对LocalConnection的修改 串。它只是把它们分成几个部分 尽可能多的“发送”语句 让他们都保持在4万以下。”