2009-05-17 67 views
0

我已经扩展ByteArray类,如下所示:麻烦克隆扩展的ByteArray

​​

和克隆使用的ByteArray#的readObject()的这个类的实例/的writeObject()。但是,由于某些原因,克隆的对象是ByteArray的实例而不是MyByteArray。这在下面的例子说明:

registerClassAlias("MyByteArray", MyByteArray); 
var b1:MyByteArray = new MyByteArray(); 
var tmp:ByteArray = new ByteArray(); 
tmp.writeObject(b1);   
tmp.position = 0; 
var b2:* = tmp.readObject(); 
trace(b2 is MyByteArray); // prints false 
trace(b2 is ByteArray); // prints true 

而且,当我在MyByteArray类添加一些自定义字段,它们没有保存的writeObject()既不克隆...

谁能给我解释一下为什么克隆的对象不是MyByteArray的实例?

非常感谢!

回答

1

我认为这是因为tmp的类型是ByteArray,而不是MyByteArray类型。如果你使用类型为MyByteArray的tmp,它应该返回一个相同类型的对象,使用writeObject我认为?或者你可能需要对它进行类型化。

+0

不,tmp需要是ByteArray类型。这是在AS3中克隆对象的典型方式,也是以ObjectUtil.copy()的形式实现的。由于tmp.writeObject()不保存MyByteArray的任何字段(在这个最小的例子中MyByteArray没有字段,但它在我的应用程序中),Typecasting并没有帮助。奇怪的是,如果MyByteArray不扩展ByteArray,那么一切正常,即克隆后b2的类型为MyByteArray。 – bartekb 2009-05-18 12:18:06

0

ByteArray可能作为对象序列化的特例处理,所以我怀疑你会绕过它。

尝试子类ByteArray听起来像是一种代码味。我会考虑使用封装而不是继承来解决您的问题。

+0

感谢您的输入。我故意使用继承,而不是封装,因为我试图欺骗Flash Player一点...我试图通过MyByteArray而不是ByteArray作为参数FileReference#save(),希望我可以“流”数据到本地文件而不是一次写入整个文件(MyByteArray将实时生成数据)。我在这里描述了这个问题:http://stackoverflow.com/questions/869816/filereference-save-duplicates-bytearray – bartekb 2009-05-19 13:11:49