データオブジェクトが40kを超える可能性がある場合のLocalConnectionの40kサイズ制限の回避
-
08-07-2019 - |
質問
Flashの LocalConnection
メカニズムには、 send()
に渡される個々のメッセージのサイズ制限が40kあります。送信する必要のある複雑なオブジェクトがあり、そのオブジェクトが大きすぎる可能性があります。
オブジェクトを複数の小さなオブジェクトに分割できますが、効率的な方法で分割したいです。数百の小さなオブジェクトになる可能性があり、それぞれを個別に送信する必要はありません。さらに、各オブジェクトは任意のサイズにすることができるため、グループ化するためにいくつかの番号を選択することはできません。
送信する前にオブジェクトのサイズを決定する方法はありますか?もしそうなら、私はそれを使用していくつかの迅速な計算を行い、オブジェクトをいくらか最適に分割することができます(または十分に小さい場合は直接送信します)。
解決
データで一時的な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つの配列を試します。すべてが十分に小さい配列のセットに到達するまで、再帰的に半分に分割し続けます(ほとんどの場合、2つ以上の分割は必要ありませんが、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
&quot;の大きなパッセージを送信する必要がある場合 文字列としてのテキストまたはXMLオブジェクト これにすぐにぶつかります 天井。私は少し共有すると思いました LocalConnectionの変更 実質的に無制限に送信できます 文字列。単純にそれらを分割します できるだけ多くの「送信」必要に応じて声明 それらすべてが40K未満に留まるようにします。
サイズを知る必要なく、送信された各セグメントが課された制限の下にあることを保証します。