2012-03-24 10 views

risposta

23

può essere serializzato; la classe ArrayList si occupa solo delle cose stesse, piuttosto che utilizzare il meccanismo predefinito. Guarda i metodi writeObject() e readObject() in quella classe, che fanno parte del meccanismo di serializzazione standard.

Se si guarda la fonte, si vede che writeObject() non salva l'array di supporto. Invece, serializza gli elementi (compresi i valori nulli) uno alla volta fino al limite size(). Ciò evita i sovraccarichi di serializzazione dell'array e, in particolare, degli slot non utilizzati alla fine dell'array. In fase di deserializzazione, viene creato un nuovo array di supporto della dimensione minima richiesta da readObject().

5

Perché questo deve essere transitorio?

Lo fa perché fornisce personalizzati readObject e writeObject metodi che fanno un lavoro migliore di serializzazione da quello predefinito. In particolare, il metodo writeObject scrive solo la dimensione e la sequenza di elementi. Questo evita di serializzare l'oggetto array privato che 1) ha la propria intestazione e overheads e 2) è in genere riempito con null s. Il risparmio di spazio può essere significativo.

(In realtà, non credo che il campo strettamente bisogno da dichiarare secondo quanto transient a tutti, ma aiuta a documentare l'intento dello sviluppatore.)

Perché può' questa classe può essere serializzata?

La classe ArrayList nel suo complesso può essere serializzato . Il Object[] potrebbe essere serializzato, ma hanno scelto di implementarlo in un altro modo.


1 - In realtà, questo dipende tipi di esecuzione degli elementi. Ad esempio, se si tenta di serializzare un ArrayList contenente i riferimenti Thread, si otterrà un'eccezione di runtime per il primo riferimento non nullo.

1

Perché implementa la serializzazione esplicita. Vedi ArrayList # writeObject.

3

ArrayList implementa Serializable, quindi può essere serializzato, che è esattamente il motivo per cui la matrice supporto privata è transient, quindi non è serializzato insieme ad altri dati della classe, dal momento che tutto è gestito da s ArrayList' writeObject e readObject metodi.

1

la variabile non è serializzabile

  • Se la variabile non è serializzabile, allora il meccanismo di serializzazione genererà un'eccezione quando si tenta di serializzare variabile. Per evitare ciò, è possibile dichiarare la variabile come transitoria.

La variabile è ridondante

  • Supponiamo che l'istanza memorizza il risultato di un calcolo. A livello locale, potremmo volere per memorizzare il risultato del calcolo, al fine di risparmiare un po 'di tempo del processore. Ma quando inviamo l'oggetto sul filo, potremmo preoccuparci di più consumando la larghezza di banda e quindi scartare il calcolo memorizzato nella cache poiché possiamo sempre rigenerarlo in seguito.

link: http://onjava.com/pub/a/onjava/excerpt/JavaRMI_10/index.html?page=3

Problemi correlati