Пытаюсь разобраться как клонировать различные объекты и чувствую, что в голове какая-то каша - понимаю, что вообще не понимаю механизм происходящего.
Вот, вроде, можно написать такую функцию, для клонирования примитивных объектов (DisplayObject пока не рассматриваем) и массивов:

Код AS3:
function clone (obj:Object):*
{
registerClassAlias("alias", getDefinitionByName(getQualifiedClassName(obj)) as Class);
var byteArr:ByteArray = new ByteArray( );
byteArr.writeObject(obj);
byteArr.position = 0;
return byteArr.readObject( );
}
и даже можно отклонировать с помощью нее какой-нибудь примитивный класс:

Код AS3:
package
{
public class MyClass
{
public var prop:int = 10;
public function MyClass ( )
{
}
}
}
Далее, если конструктор клонируемого класса предполагает наличие параметров, то появляются первые подводные камни:

Код AS3:
package
{
public class MyClass
{
public var prop:int;
public function MyClass (param:int)
{
prop = param;
}
}
}
при попытке клонирования

Код AS3:
var my1:MyClass = new MyClass(10);
var my2:MyClass = clone(my1);
выкинет исключение, что неверное количество параметров - 0 параметров вместо 1 в конструкторе MyClass( ).
Т.е. получается восстановление из ByteArray по сути запускает сначала конструктор? Что вообще там происходит?
Проблема с неверным количеством параметров решается через присвоения дефолтного значения параметру конструктора:

Код AS3:
public function MyClass (param:int = 0)
{
prop = param;
}
в этом случае, как я понимаю, при клонировании запускается конструктор с дефолтным значением параметра, а потом свойству prop клона присваивается значение свойства prop клонируемого объекта?
Но если дальше еще чуть усложнить класс, то начинается петрушка, которой я не могу найти объяснения и не понимаю, что делать.

Код AS3:
package
{
public class MyClass
{
public var prop:int;
public var arr:Array;
public function MyClass (param1:int = 1, param2:int = 1)
{
prop = param1;
arr = new Array(param1 * param2);
}
}
}
При попытке клонирования экземпляра этого класса:

Код AS3:
var my1:MyClass = new MyClass(10, 5);
var my2:MyClass = clone(my1);
получаем, что длина массива my1.arr.length равна 50, но длина массива my2.arr.length равно 0. Т.е. после вызова конструктора во время клонирования не происходит дублирования значения переменной arr клонируемого объекта в значение переменной arr клона (по крайней мере с массивами это не работает). Более того, длина массива в клоне почему-то и не становится равной 1, как можно было бы ожидать при использовании дефолтных значений параметров конструктора.
Для начала с этими моментами бы разобраться, а потом, если будут вопросы, я их буду задавать по ходу дальнейших попыток понять, что происходит.