|
Una altra importantissima condizione, che in questo caso non si nota bene,
è che sia i parametri dei metodi che i valori ritornati siano serializzabili.
I tipi primitivi e quelli predefiniti escono dalla fabbiaca di per sè serializzabili,
quindi nel nostro caso non ci sono grandi problemi. Come parametri e valori
ritornati usiamo solo stringhe.
In generale però spesso si desidera passare e ritornare come oggetti remoti
altre classi definite dall’utente. In questo caso è necessario rendersi bene
conto di una cosa. Quando il client invoca un metodo remoto, effettua una
copia dell’oggetto dal client al server, e lo stesso succede dal server al
client quando viene ritornato il risultato. Nella invocazione normale si
passa semplicemente un riferimento all’oggetto, e se un metodo lo modifica
l’oggetto passato, questa modifica si ripercuoterà sul chiamante che al ritorno
troverà l’oggetto modificato. Invece nell’invocazione di metodi remoti, il
server ottiene una copia dell’oggetto che è indipendente dal quella passata
come parametro, quindi modificare un oggetto non è sufficiente per ritornare
un risultato: bisogna anche ritornarlo come risultato per fare sì che il
chiamante veda le modifiche.
Questo ha anche un impatto sull’efficienza. Non si può passare a cuor leggero
come parametro un oggetto complesso, altrimenti si potrebbe anche copiare
involontariamente una enorme quantità di dati (e in Java questo può succedere
più facilmente di quanto non sembri). Poichè la copia di oggetti in andata
(passaggio parametri) e ritorno (valori risultanti) avviene utilizzando il
meccanismo della serializzazione è necessario rendere esplicitamente serializzabili
le classi definite dall’utente. I tipi primitivi e molti classi della API
1.1 sono serializzabili. Per rendere serializzabili oggetti che hanno come
campi solo oggetti serializzabili è sufficiente dichiarare implements java.io.Serializable.
In casi più complessi è necessario provvedere ad una serializzazione ad hoc.
Per esempio non è usare passare come argomenti di un oggetto remoto classi
come java.io.InputStream che non sono serializzabili.
|