为什么这个ByteArray实验崩溃了AIR

时间:2011-12-04 22:17:22

标签: actionscript-3 flex air adobe

我正在将数据写入新的ByteArray并将其存储到LocalStore

var ba:ByteArray = new ByteArray;
ba.writeObject(theobject);

EncryptedLocalStore.setItem(MY_VAL_STORE, ba); //bytes in local store

作为一个实验,我试图将前两行变成一行,所以我正在使用这种语法(我基本上将新的ByteArray放在括号中并立即使用它)。

var ba:ByteArray = (new ByteArray).writeObject(theobject) as ByteArray;

EncryptedLocalStore.setItem(MY_VAL_STORE, ba); //bytes in local store

但这会让我的AIR应用程序在运行时崩溃。如果我回到2行,它工作正常。我意识到这不是什么大问题,但我很好奇为什么这种创造性的语法不起作用。有什么想法吗?

在<1>版本中

注意:,如果我不添加as ByteArray,它会抱怨我正在尝试使用类型void和ByteArray。

2 个答案:

答案 0 :(得分:8)

你自己回答了你的问题:

  

它抱怨我正在尝试使用ByteArray类型的void。

在您的声明中,您将writeObject()的结果分配给ByteArray变量,而不是new ByteArray()创建的实例。由于结果类型为void,因此该赋值是非法的,会导致编译器抛出错误。然后,您已经向ByteArray添加了void的手动转换,这显然足以欺骗编译器,但不会在运行时阻止类型转换错误。

简而言之:只有在新实例上调用的方法返回this时,此类型的赋值才有效。顺便说一下,使代码更具可读性的有用方法,也称为Method Chaining的概念。

答案 1 :(得分:1)

查看writeObject调用的文档,我猜您的代码无效,因为该方法的返回值为void,并且您尝试将其强制转换为ByteArray