Mobilidade em aglets

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

Last modified: Mon Dec 4 13:14:43 BRST 2000