在为元素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中的动作脚本文件中没有这个问题,但只有空气。
答案 0 :(得分:0)
我认为你的代码中有两个错误。
byteArray.writeObject();
应该是byteArray.writeObject(array);
,根据Adobe关于byteArray.writeObject。
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
修改:
编辑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
希望能帮到你。