« Конференция User ExperienceРешение проблемы наследования от Point. »

Клонирование объектов утилитой ObjectUtil.copy

Нам понадобилось клонировать объект. Для этого в as3 можно использовать утилиту ObjectUtil.copy. Метод ObjectUtil.copy(obj) возвращает копию исходного объекта obj. Это замечательно работает для невизуальных объектов.
Пример:

  1. package com.test
  2. {
  3.         public class TestClass
  4.         {
  5.                 public var index : int = 100;
  6.         }
  7. }
  8.  
  9. ...
  10. var testObject:TestClass = new TestClass();
  11. testObject.index = 98;
  12. var cloneTestObject : Object = ObjectUtil.copy(testObject);
  13. trace(“cloneTestObject.index : ” + cloneTestObject); // cloneTestObject.index : 98
  14. ...

Но есть ложка дегтя. Данная функция возвращает анонимный объект. И система не позволяет осуществить его приведение к исходному классу.
Данный код приведет к сбою в программе:

  1. ...
  2. var testObject:TestClass = new TestClass();
  3. testObject = 99;
  4. var cloneTestObject : TestClass = ObjectUtil.copy(testObject) as TestClass;
  5. trace(index: ”+  cloneTestObject.index);
  6. ...

После некоторых исследований и подсказки Константина Ковалёва, находим метод flash.net.registerClassAlias. Который и решает проблему:

  1. ...
  2. var testObject:TestClass = new TestClass();
  3. registerClassAlias(getQualifiedClassName(testObject), TestClass);
  4. var cloneTestObject : TestClass = ObjectUtil.copy(testObject) as TestClass;
  5. ...

Для тех, кто хочет докопаться до сути процесса. В справке по registerClassAlias написано: «LocalConnection, ByteArray, SharedObject, NetConnection and NetStream are all examples of classes that encode objects in AMF.» Так как метод ObjectUtil.copy, использует ByteArray, то наш результирующий объект кодируется в формат AMF. Для восстановления класса объекта, используется функция flash.net.registerClassAlias.

Постоянная ссылка 2007-05-08 11:30:56, от agahov Email , 654 слов, Рубрики: Flex, AS3 , 4 комментариев »

4 комментариев

Интересный метод registerClassAlias, думаю, что очень удобно при работе с SharedObject-ми. Как-то раньше не использовала, но думаю, что стоит начать.
Спасибо за интересный пост. :)
2007-05-08 @ 11:54
Комментарий от: Евгений Потапенко [Посетитель] Email · http://www.potapenko.com/
если добавить getDefinitionByName() получается полезная утилитка:


package com.potapenko.util
{
import flash.net.registerClassAlias;
import flash.utils.getQualifiedClassName;
import flash.utils.getDefinitionByName;
import mx.utils.ObjectUtil;

public class CloneUtil
{
public static function clone(o:Object):Object
{
var name:String = getQualifiedClassName(o);
registerClassAlias(name, getDefinitionByName(name) as Class);
return ObjectUtil.copy(o);
}
}
}
2007-05-15 @ 03:00
такая утилита конечно напрашивается,
но я не знаю, что происходит при неоднократном вызове registerClassAlias, для одного и того же класса. (Например, утечка памяти). Так что стараюсь воздерживаться от таких обобщений.
2007-05-15 @ 12:25
Очень жаль, что я прочитал Ваш пост только сегодя :) А то клонируем объекты через new myObj.constructor(); с присвоением остальных параметров. Для этого приходится клипартам, приходящим из Flash CS3 проставлять Linkage (иначе не будет толкового конструктора).
2007-11-03 @ 10:20

Оставить комментарий


Ваш email адрес. (Не будет показан на сайте.)

Ваш URL будет показан.
:!: :?: :idea: :) :D :p B) ;) :> :roll: :oops: :| :-/ :( :'( |-| :>> :yes: ;D :P :)) 88| :. :no: XX( :lalala: :crazy: >:XX
(Заменить прерывания строк на <br />)
(Имя, email и сайт)
(Разрешить пользователям посылать вам сообщения (ваш email не отображается).)
3 + 2 + 7 - 1?
antispam test

Вы можете использовать OpenID чтобы предоставить ваше имя, email и url.