[RemoteClass] и deep-copy во Flex
За оние кои некогаш правеле Flash Remoting секако дека наишле на
[RemoteClass] тагот којшто стои на почетокот на класата и изгледа вака:
package primer
{
[RemoteClass(alias="nekojJavapaket.Contact")]
public class Contact {
...}
...
}
[RemoteClass] е суштинска за да покаже во која класа на серверот се
мапира нашата класа. AMF форматот преку којшто се изведува целата серијализација/
десеријализација ги праќа објектите како низа од бајти и ја задржува структурата на
целиот објект, но не и референцата за неговата класа. За да може
серверот да го знае тоа, мора да го испочитуваме овој таг.
Замислете си ако повикуваме некој метод на серверот и му праќаме како аргумент некој
објект. AMF си ја врши работата со серијализација/десеријализација и сите членови
на нашиот објект стасуваат до серверот, но не како објект од одредена класа. И ако
потоа на серверот сакаме да манипулираме со овој објект како инстанца од одредена класа
ќе наидеме на проблеми. Со употребата на овој таг се решава прашањето на класата на објектот.
- - - - - - - - - - - - - -
Важноста на овој таг не завршува тука. Со истиот проблем се соочуваме
и ако вршиме копирање на објект со помош на алатката
ObjectUtil и
неговиот метод
copy(). Овој метод служи за "длабочинско копирање" (deep-copy) на објектите,
односно се копираат заедно со зададениот објект и оние објекти до кои тој носи референци.
Тој во себе содржи едноставен механизам како следниот:
var buferce:ByteArray = new ByteArray();
buferce.writeObject(nekojObjekt);
buferce.position = 0;
var result:Object = buferce.readObject();
return result;
Но ако сакаме да копираме цел објект како што е во следниот случај, ќе имааме проблеми со casting, зашто иако цел објект е ископиран од "збор до збор", фали информација за класата.
var classCopy:someClass = someClass( ObjectUtil.copy( myObject ) );
Таа информација, како што е погоре кажано може да се додаде со
[RemoteClass] тагот, само што сеганема да покажува некаде надвор, туку на целосната патека на дефиницијата на класата.
[RemoteClass(alias="nekojFlexPaket.someClass ")];
------
Voila!