Quando um aglet é despachado, clonado ou desativado, ele é convertido (marshalled) para uma representação em bytes de onde o aglet pode ser restaurado (unmarshalled) posteriormente. Para realizar esse processo, o mecanismo de serialização de objetos de Java é utilizado. Assim, todos os objetos que compõem o estado do aglet precisam ser serializáveis (implementar a interface java.io.Serializable ) ou ser declarados como transientes:
class ListingAglet extends Aglet { // result and its contents are transferred. private Vector result = new Vector(); transient InputStream in = new InputStream(); // will not be transferred }
Se um objeto não serializável é encontrado como parte do grafo de um objeto aglet, a exceção java.io.NotSerializableException é gerada.
A forma normal de transferência de objetos em aglets é por valor, ou seja, através do mecanismo de serialização uma cópia dos objetos é criada. Uma alternativa para manter referências a aglets (e assim permitir seu compartilhamento mesmo após transferência) é usar AgletProxy:
class Transferrable implements java.io.Serializable { Hashtable hash; // Hashtable is also serializable } class NotTransferrable { int dummy; } class MyClass extends Aglet { transient FileDescriptor fd; // never get transferred. int value; // moved by value String str; // moved by value Object transferable = new Transferrable(); // move by value Object not_transferable = new NonTransferable(); // throws NotSerializableException. AgletProxy proxy; // moved by reference }
Variáveis de classe (estáticas) não fazem parte de objetos, não sendo portanto serializadas. Assim, uma dada variável pode ter valor diferente ao chegar em seu novo destino:
public class MyAglet extends Aglet { static int class_variable = 0; public void onCreation(Object init) { class_variable = 10; dispatch("atp://next.place"); } public void run() { if (class_variable != 10) { System.out.println("Class variable never get transferred!"); } } }
© Ivan L. M. Ricarte
DCA/FEEC/UNICAMP