Как клонировать объект в Flex?

Я хочу клонировать объект Canvas, который содержит поверхность Degrafa с несколькими геометрическими фигурами.

я попробовал наивный подход:

return ObjectUtil.copy(graph_area) as Canvas;

что привело к ошибкам:

TypeError: Error #1034: Type Coercion failed: cannot convert Object@63b1b51 to com.degrafa.geometry.Geometry.
TypeError: Error #1034: Type Coercion failed: cannot convert Object@63b1039 to com.degrafa.geometry.Geometry.
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at mx.core::Container/addChildAt()[C:autobuild.2.0frameworksprojectsframeworksrcmxcoreContainer.as:2196]
    at mx.core::Container/addChild()[C:autobuild.2.0frameworksprojectsframeworksrcmxcoreContainer.as:2140] ...

5 ответов


то, что вы хотите, называется глубокой копией, создайте новый экземпляр с той же информацией оригинала.

единственный способ, которым я знаю, как это сделать, - использовать ByteArray следующим образом:

private function clone(source:Object):*
{
    var buffer:ByteArray = new ByteArray();
    buffer.writeObject(source);
    buffer.position = 0;
    return buffer.readObject();
}

AS3 действительно не хватает объекта.клон.)(..


метода objectutil

статический метод метода objectutil.copy () - это "объект в AS3 это.clone ()":

public static function copy(value:Object):Object

копирует указанный объект и возвращает ссылку на копию. Этот копирование производится с помощью родной метод сериализации. Это средство эта пользовательская сериализация будет уважаемый во время копирования.

этот метод предназначен для копирования объекты данных, такие как элементы коллекция. Это не предназначен для копирование объекта UIComponent, например элемент управления TextInput. Если хочешь ... создание копий конкретного компонента UIComponent объекты, вы можете создать подкласс компонент и реализация клона() метод или другой метод для выполнения копировать.


Я обнаружил, что пытаюсь что-то больше похожее на это, увы, он все еще не копирует TextArea (он же объект UI)...

public function duplicateObject(sourceObject:*, targetObject:*):void {
    var buffer:ByteArray = new ByteArray();
    buffer.writeObject(sourceObject);
    buffer.position = 0;
    targetObject = buffer.readObject();
}

Я получил ту же проблему (для интерфейса NamedEntity, который я создал), искал ответ здесь, но только получил его, сделав вызов метода registerClassAlias (который я взял из http://richapps.de/?p=34). Вот так просто:--4-->

public static function clone(namedEntity:NamedEntity):NamedEntity {
registerClassAlias('test',ReflectionUtil.classByObject(namedEntity));
var returnObject:NamedEntity = ObjectUtil.copy(namedEntity) as NamedEntity;
}

Я не думаю, что ObjectUtil.копирование будет работать для клонирования холста. Согласно документу flex:

копировать Этот метод предназначен для копирования объектов данных, таких как элементы коллекции. Он не предназначен для копирования объекта UIComponent, например элемента управления TextInput. Если вы хотите создать копии определенных объектов UIComponent, вы можете создать подкласс компонента и реализовать метод clone() или другой метод для выполнения копирования.