ActionScript 3.0如何通过网络发送多维对象数组

时间:2013-09-21 10:55:15

标签: arrays actionscript-3 multidimensional-array netstream netconnection

我是AS 3.0的这一部分的新手。我找到了Lee Burrows的例子。这工作正常,但我需要发送一个复杂的对象数组或至少多维数组。我无法让它发挥作用。

苦苦挣扎了一个星期。有人可以帮忙吗?

以下是代码的各个部分:

 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。

3 个答案:

答案 0 :(得分:1)

你考虑过使用JSON吗?

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

只需使用stringify()将其转换为JSON,并使用另一侧的parse()对其进行解码。 如果“另一方”不是AS3,您应该能够以任何语言轻松解析JSON。

答案 1 :(得分:0)

如果将Array / Vector / Object转换为Flash现在支持的JSON对象,则可以轻松完成。

答案 2 :(得分:0)

我要做的就是让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);