air writeObject()没有正确编写数组

时间:2014-12-27 16:10:46

标签: arrays actionscript-3 flash air

在为元素0赋值之前创建数组并为元素32或36或40或44或....赋值时,会导致writeObject()表现得非常奇怪。以下代码应足以重现它:

var array:Array = new Array();
//array[0]=0;
array[32]=1;
array[0]=0;
var  byteArray:ByteArray = new ByteArray();
byteArray.writeObject(array);
byteArray.position=0;
array = byteArray.readObject();
trace(array)              //1
trace(array[0])           //1

这显然不是这个代码的预期,如果添加了现在是注释的行,它确实正常工作。同样将32改为较低的数字或不是4的多数也可以解决问题。

我的问题:任何人都可以确认有同样的问题,我该如何解决? 我目前正在使用Flash Builder 4.7并且与flash专业版5.5有相同的问题,但没有使用flash 5.5的调试器。此外,我在flash 5.5中的动作脚本文件中没有这个问题,但只有空气。

1 个答案:

答案 0 :(得分:0)

我认为你的代码中有两个错误。

  • byteArray.writeObject();应该是byteArray.writeObject(array);,根据Adobe关于byteArray.writeObject

  • 根据{{​​3}},
  • byteArray.readObject(array);应为byteArray.readObject();

这将为您提供以下代码:

var array:Array = new Array();      
    array[15] = 15;
    array[0] = 0;
    array[32] = 1;
var byteArray:ByteArray = new ByteArray();
    byteArray.writeObject(array);
    byteArray.position = 0;
var a:Array = byteArray.readObject();
    trace(a.length);        // gives : 33
    trace(a);               // gives : 0,,,,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,1
    trace(a[0]);            // gives : 0

修改:

enter image description here

编辑2:

您也可以使用Object代替Array,如下所示:

trace('AIR version : ' + NativeApplication.nativeApplication.runtimeVersion); 
// AIR version : 15.0.0.356

var obj:Object = {}
    obj[2014] = 2015;
    obj[15] = 15;
    obj[32] = 1;    
    obj[0] = 0;

var byteArray:ByteArray = new ByteArray();
    byteArray.writeObject(obj);
    byteArray.position = 0;

var o:Object = byteArray.readObject();      
    for(var attr:String in o){
        trace(attr + ' = ' + o[attr]);
    }
    // gives : 
    // 32 = 1
    // 0 = 0
    // 2014 = 2015
    // 15 = 15

希望能帮到你。