データを使用して一時的な 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% 保証されているわけではありませんが、十分な大きさにするのに十分なデータを入力するユーザーはいない可能性が高く、今のところこのケースを無視することで、物事がはるかに簡単になります)。この前提を踏まえて、送信する前に配列をチェックします。大きすぎる場合は、半分に分割して、これら 2 つの配列を試します。すべてが十分に小さい一連の配列に到達するまで、再帰的に半分に分割し続けます (ほとんどの場合、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