Apache flex 克隆扩展字节数组时遇到问题
我扩展了ByteArray类,如下所示:Apache flex 克隆扩展字节数组时遇到问题,apache-flex,flash,actionscript-3,Apache Flex,Flash,Actionscript 3,我扩展了ByteArray类,如下所示: [RemoteClass(alias="MyByteArray")] public class MyByteArray extends ByteArray {} 并使用ByteArray#readObject()/writeObject()克隆了该类的一个实例。但是,由于某些原因,克隆的对象是ByteArray而不是MyByteArray的实例。以下示例对此进行了说明: registerClassAlias("MyByteArray", MyByteA
[RemoteClass(alias="MyByteArray")]
public class MyByteArray extends 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的实例吗
非常感谢 我认为这是因为tmp是ByteArray类型,而不是MyByteArray类型。如果将tmp设置为MyByteArray类型,它应该返回相同类型的对象,我想是使用writeObject吗?或者您可能需要对其进行类型转换。ByteArray可能作为对象序列化的特例处理,因此我怀疑您是否能够绕过它
试图对ByteArray进行子类化对我来说就像是一种代码味道。我会考虑使用封装而不是继承来解决您的问题。不,tmp需要是ByteArray类型。这是在AS3中克隆对象的典型方式,也是作为ObjectUtil.copy()实现的。类型转换没有帮助,因为tmp.writeObject()不保存MyByteArray的任何字段(在这个最小的示例中,MyByteArray没有字段,但在我的应用程序中有)。奇怪的是,如果MyByteArray没有扩展ByteArray,那么一切都正常,即克隆后b2是MyByteArray类型。感谢您的输入。我故意使用继承而不是封装,因为我试图欺骗Flash Player一点。。。我试图将MyByteArray而不是ByteArray作为参数传递给FileReference#save(),希望能够将数据“流”到本地文件,而不是一次写入整个文件(MyByteArray将实时生成数据)。我已经在这里描述了这个问题:尝试在对象上实现IDataInput。如果做不到这一点,我所知道的唯一解决方案是纯AIR(FileStream),在阅读了它之后,看起来您需要将内容流式传输到ByteArray(实现IDataOutput)中,然后保存该ByteArray实例。重新加载时,您可以从中读取(它还实现了IDataInput)。我的内容大于可用内存,因此我无法通过teArray将整个内容流式传输到内存中。我需要将它直接(或分块)流式传输到一个文件中,就像在FileStream类中一样(仅限AIR)。然而,在我看来,这在Flash 10中是不可能的。。。