1

我是 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。

4

3 回答 3

1

你考虑过使用 JSON 吗?

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

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

于 2013-09-21T17:11:13.363 回答
0

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

于 2013-09-21T17:10:57.860 回答
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);
于 2013-09-21T23:54:09.183 回答