Clone Instances and keep Class reference

While checking out the Socket class i found a cool little trick. I´m sure everyone knows of the possibility to clone an Object with the help of the ByteArray Class. This method was introduced (at least to me ;-) ) by senocular here.
The function looks like this:
function clone(source:Object):* {
var copier:ByteArray = new ByteArray();
copier.writeObject(source);
copier.position = 0;
return(copier.readObject());
}
The problem was that all the class information was lost. With class information i mean type info and thinks like methods were unavailable after cloning the object. When you try this:

var t:Test=new Test();
t.test=”hallo”;
var newObj=clone(t);
out.text=newObj.test;
out.text=newObj.sayHello();

I get the following error:

TypeError: Error #1006: sayHello ist keine Funktion.
at test/::show()
at test/___Button2_click()
But there is this nice Method registerClassAlias from the flash.net package. Using this:

registerClassAlias(”de.benz.something”, Test);
var t:Test=new Test();
t.test=”hallo”;
var newObj=clone(t);
out.text=newObj.test;
out.text=newObj.sayHello();

will keep the class information intact and the call to the method will be succesfull.
Man this is sooo cool. I´m loocking forward using this in two years when my company switches to flash 9 :-)
Anyone looking for a flex developer?

cheers

Benz

I

Comments

5 Responses to “Clone Instances and keep Class reference”

  1. Camus on January 11th, 2007 2:35 am

    Hi… thanks for the solution.

    I found the cloned is not really a class, is it what we expected?

    Thanks

  2. ericsoco on April 24th, 2007 9:39 pm

    almost fixes the problem, but if Test’s constructor requires a parameter, you get a runtime error when calling ByteArray.readObject(), saying that you’re missing params…

  3. Dan Schultz on April 24th, 2007 10:52 pm

    If the class that you are trying to clone has any arguments in the constructor, this method of cloning fails. You’ll get an error like so: ArgumentError: Error #1063: Argument count mismatch on User$iinit(). Expected n, got 0.

    The only work around is adding “= null” to all of your constructor’s arguments. Not the most elegant solution, but it works.

  4. Jeff on September 25th, 2007 11:10 pm

    awesome dude! I was just trying this out on my own…very cool.

  5. Govindan on July 16th, 2008 3:43 pm

    I tried to clone a diaplayobject(Movieclip with some frames) but the above code did’t seem to work. It throws a null object reference error. Any way to clone a displaybject ?

Leave a Reply