Вы не можете изначально скопировать большинство внутренних классов, но вы можете захотеть заглянуть в IExternalizable (http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/utils/IExternalizable.html)
Это метод сериализации объектов, используемый внутри AMF. Он заставляет ваши объекты создаватьдва метода, readExternal и writeExternal. Идея состоит в том, что writeExternal позволяет упаковывать внутреннее состояние объектов в ByteArray, затем создается новый экземпляр вашего класса, и AMF передает этот ByteArray в метод readExternal, где вы можетевручную воссоздайте предыдущее внутреннее состояние объектов. Вызов методов и создание экземпляров выполняются с помощью метода ObjectUtil.copy () (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/ObjectUtil.html?filter_flex=4.1&filter_flashplayer=10.1&filter_air=2#copy()), если вы используете Flex SDK, в противном случае - реализацию копирования.выглядит следующим образом:
function copy(value:*):*{
var buffer:ByteArray = new ByteArray();
buffer.writeObject(value);
buffer.position = 0;
var result:Object = buffer.readObject();
return result;
}
Как вы можете видеть здесь, только методы readObject и writeObject ByteArray фактически выполняют сериализацию, в действительности нет необходимости в классе ObjectUtil.
Вам также может понадобиться зарегистрировать псевдоним класса для классавы хотите скопировать, чтобы AMF знал, какой объект создать, иначе вы просто получите универсальные объекты на другом конце:
registerClassAlias("com.example.ExampleClass", com.example.ExampleClass);
Следует отметить, что вы не можете иметь требуемые параметры в конструкторе объектов, которые вы хотитекопировать этим методом, и что readObject ByteArray проверит объект, чтобы увидеть, реализует ли он IExternalizable, в противном случае он просто скопирует свои открытые свойства.Вот почему большинство встроенных классов не смогут скопировать.
В отношении копирования графики из экранных объектов можно использовать несколько методов:
Начиная с FP 10Графика имеет еще один полезный метод.
public function copyFrom(sourceGraphics:Graphics):void
(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Graphics.html#copyFrom())
Так что, как только вы скопировали свой объект, вы можете затем вручную скопировать графику. Просто вставьте это вМетод copy (). Просто проверьте, расширяет ли он Sprite или MovieClip, а затем вызовите copyFrom (). Это было бы проще всего написать.
А вот еще один новый метод.
public function drawGraphicsData(graphicsData:Vector.<IGraphicsData>):void
(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Graphics.html#drawGraphicsData())
Если вы должны были сохранить все команды в виде необработанных данных (даже в формате JSON или создать внутренние DTO), то напишите методы IExternalizable, чтобы скопировать команды в новый объект и заполнить заново.Графика с использованием этого метода. Это было бы проблематично писать, но это означало бы, что вы просто вызываете метод copy (), и у вас есть копия, Graphics и все, без какого-либо специального кода в методе copy (). Вы также можете вызватьГрафические методы динамически основаны на командах, так что вы можете заставить это работать в FP9 при необходимости.Это имеет дополнительный бонус, позволяющий вам изменять команды, поскольку в настоящее время это невозможно.Как только вы пишете в графику, вы застряли с ней.