Я нашел способ как минимум оценить размер объекта перед отправкой его в 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