ActionScript 3.0 Как отправить многомерный массив объектов по сети

Я новичок в этой части AS 3.0. Я нашел пример Ли Берроуза. Это прекрасно работает, но мне нужно отправить сложный массив объектов или, по крайней мере, многомерный массив. И я не могу заставить его работать.

Неделю с этим борюсь. Кто-нибудь может помочь?

Вот части кода:

 private function netHandler(event:NetStatusEvent):void
    {
        //update UI
        outputText.text +=  "[EVENT]\n" + event.info.code + "\n";
        //handle event
        switch (event.info.code)
        {
                //connection succeeded so setup a group
            case "NetConnection.Connect.Success" :


                ns1 = new NetStream(netConn);

                setupGroup();
                break;
                //group setup succeeded so enable submit
            case "NetGroup.Connect.Success" :
                submitButton.enabled = true;
                break;
                //posting received so add to output
            case "NetGroup.Posting.Notify" :


                var myObjectList:Array = new Array();
                myObjectList = event.info.message;
                dl.dataProvider = myObjectList[0];
                dl.rowCount = myObjectList[0].length;
                gd.dataProvider = myObjectList[1];
                gd.rowCount = myObjectList[1].length;
                outputText.text +=  "[RECEIVED]\n" + event.info.message.txt + "\n";
                break;
        }
    }

я получаю сообщение об ошибке

TypeError: Ошибка № 1034: Ошибка приведения типа: невозможно преобразовать Object@7bc4dd9 в fl.data.DataProvider.


person user2801851    schedule 21.09.2013    source источник
comment
преобразовать в строку с помощью JSON. Это лучше всего при отправке на сервер, потому что большинство языков анализируют его изначально, PHP, ColdFusion и т. д.   -  person NappingRabbit    schedule 23.09.2013


Ответы (3)


Рассматривали ли вы возможность использования JSON?

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/JSON.html

Просто используйте stringify(), чтобы преобразовать его в JSON, и parse() с другой стороны, чтобы декодировать его. Если «другая сторона» не AS3, вы сможете легко анализировать JSON на любом языке.

person lbarbosa    schedule 21.09.2013

Это легко сделать, если вы преобразуете свой массив/вектор/объект в объект JSON, который Flash теперь поддерживает изначально.

person Creative Magic    schedule 21.09.2013
comment
он теперь родной? с какой версии? - person NappingRabbit; 23.09.2013
comment
FP 11, help.adobe.com/en_US/FlashPlatform/reference /actionscript/3/ - person Creative Magic; 23.09.2013

Как я это сделаю, позволю объекту ByteArray сериализовать массив в AMF (автоматически), сжать его и отправить:

Отправка данных:

var byteArray:ByteArray = new ByteArray();
var array:Array = [[new Date(), 24], [new Shape(), 24.5], 1 / 2];
byteArray.writeObject(array);
byteArray.compress(CompressionAlgorithm.LZMA); //Optional
netGroup.sendTo-AllNeighbors/nearest/Neighbor(byteArray);

Получение данных:

//private function onReceiveData(data:Object):void 
var byteArray:ByteArray = data as ByteArray;
byteArray.uncompress(CompressionAlgorithm.LZMA); //if compressed
var array:Array = byteArray.readObject();
trace("@", getTimer(), ": ", array, "\n");

Выход:

@2676: Sun Sep 22 02:41:36 GMT+0300 2013,24,[object Object],24.5,0.5

Конечно, если это необходимо вне приложения AS3, вам нужно будет использовать сторонние библиотеки (их много!) для другого используемого языка.

Другим вариантом было бы использовать JSON, но я предполагаю, что данные для передачи будут намного больше, и их анализ займет гораздо больше времени (манипулирование строками по сравнению с оптимизированным доступом к двоичным данным!)


РЕДАКТИРОВАТЬ: Чтобы сериализовать и прочитать пользовательские классы (как пользовательский класс, а не общий объект), вы должны заранее зарегистрировать псевдоним класса следующим образом:

import flash.net.registerClassAlias
registerClassAlias("com.CustomClass", CustomClass);
person chadiik    schedule 21.09.2013