Apache flex 复制类的实例
好的,ObjectUtil.copy是复制对象的好方法。但是在使用它复制其他类时遇到了很多问题,我想这不是我想要的解决方案 如何复制/克隆已定义的类的实例?也许用类定义一个函数来复制它 在flex中,大多数变量都是通过引用传递的,这很酷,但有时无法控制这一点会让人恼火(对不起,我太习惯使用纯C了) 谢谢 更新: 更准确地说,由于我无法使ObjectUtil.copy()与自定义类一起工作,因此。。。有没有办法通过使用序列化来复制自定义类?您是否成功地将ByteArray副本与自定义类一起使用Apache flex 复制类的实例,apache-flex,class,Apache Flex,Class,好的,ObjectUtil.copy是复制对象的好方法。但是在使用它复制其他类时遇到了很多问题,我想这不是我想要的解决方案 如何复制/克隆已定义的类的实例?也许用类定义一个函数来复制它 在flex中,大多数变量都是通过引用传递的,这很酷,但有时无法控制这一点会让人恼火(对不起,我太习惯使用纯C了) 谢谢 更新: 更准确地说,由于我无法使ObjectUtil.copy()与自定义类一起工作,因此。。。有没有办法通过使用序列化来复制自定义类?您是否成功地将ByteArray副本与自定义类一起使用 感
感谢您的回复。如果您可以控制整个类层次结构,我建议在每个类中实现
clone()
接口。这很乏味,但随着复杂性的增加,它会得到回报
(如果语法有点错误,请原谅,已经有一段时间了)
对于每个类,实现方法
public class MyClass1 implements ICloneable {
...
public function clone() : Object {
var copy:MyClass1 = new MyClass1();
// copy member variables... if it is a user-defined object,
// make sure you call its clone() function as well.
return copy;
}
}
要创建对象的副本,只需调用clone()
函数
var copy:MyClass1 = original.clone();
作为旁注,Java和.NET似乎都在其基础对象
类上采用了clone
方法。我不知道ActionScript类的类似方法。两个常见的习惯用法:
- 一种
方法克隆
- 复制构造函数
这两种方法都可以让你定义复制的确切含义——你可能希望一些东西复制得很浅,而另一些东西复制得很深。如果你认为在你的情况下实现
克隆
接口不是正确的方法,我建议你看看这个对象。我自己没有使用过它,但它似乎给了您对单个字节所需的所有控制。您可以从任何对象和从任何对象到任何对象
Seneyular对其进行了快速概述
祝你好运 ObjectUtil.copy在内部使用ByteArray创建副本。为了使复制成功,ByteArray要求flash player知道您的自定义类。您可以通过使用globalregisterClassAlias方法注册类来实现这一点
例如:
//one time globally to the application.
registerClassAlias(getQualifiedClassName(CustomClass), CustomClass);
//then
var c1:CustomClass = new CustomClass();
c1.name = "customClass";
var c2:CustomClass = ObjectUtil.copy(c1);
trace(ObjectUtil.toString(c1))
trace(ObjectUtil.toString(c2))
您很难复制哪些类或对象?根据您的问题,听起来好像您正在尝试复制您创建的自定义类。是否存在未正确复制的类的对象或属性?多了解一些信息可能会有所帮助。:)是的,这些是自定义类,包含许多对象和属性。当我使用'var cclassins2:cclass=ObjectUtil.copy(cclassins1)作为cclass'时,我不会得到一个副本,而是一个null。因此,我猜该函数只适用于普通的“对象”类。我相信这是:的重复,也许您只是缺少了
registerClassAlias()
?我同意佐特尼的观点。这可能是最好的解决办法。我确实考虑过这样做。。。但是,我想知道,有没有办法复制实例的整个数据块?(据我所知,这是序列化)它似乎比复制每个变量对我来说都更为优化。我使用的另一种技术是创建一个接口,实现toXML
和fromXML
函数,但这听起来对您的场景也没有好处:-/请参阅我关于ByteArray
的新答案。我想它能满足你的需求。祝你好运我必须在这里添加的唯一一点是,强烈建议在事件类上使用克隆方法。如果它们不存在,我相信一些问题是由冒泡事件引起的。谢谢你的回复,但我真的不在乎这个问题中克隆和复制的区别。flex的ObjectUtil中的Afaik克隆保留uid,而copy不。。。我认为这并没有太大改变这个问题,它更多地与实例复制/克隆的方法有关。无论如何,把这个问题当作是关于深度复制的问题。这是一种常见的方法,几乎与其他答案中提到的方法相同。谢谢!有趣的是,我在过去的某个时候使用过相同的函数(当然,我复制粘贴了它)。我不会以这种方式递归地删除所有引用(自定义类中的类和对象),但我想我可以将公开的两种方法结合起来。。。(在克隆函数中,首先使用此ByteArray方法复制数据,然后通过调用子对象自己的克隆函数更正子对象的数据)。还有其他方法吗?嗯。。。ByteArray方法不起作用。。。事实上,我想我以前在这门课上试过。更多关于这个稍后:染色。。。这与ObjectUtil.copy()使用的代码完全相同。它给了我一个null,就像我使用Object.clone()时一样(它调用了这个ByteArray副本并递归更正了uid)。我想知道为什么它不能与我的邪恶类一起工作……嗯……我并不奇怪ObjectUtil.copy()
在内部使用它。我被难住了。你能指出类中某个特定的成员变量在复制过程中出错吗?我相信OP不知道他也需要做registerClassAlias()
。此处的参考:
function clone(source:Object):* {
var copier:ByteArray = new ByteArray();
copier.writeObject(source);
copier.position = 0;
return(copier.readObject());
}
//one time globally to the application.
registerClassAlias(getQualifiedClassName(CustomClass), CustomClass);
//then
var c1:CustomClass = new CustomClass();
c1.name = "customClass";
var c2:CustomClass = ObjectUtil.copy(c1);
trace(ObjectUtil.toString(c1))
trace(ObjectUtil.toString(c2))