2012-03-24 10 views

Odpowiedz

23

Może być może być zserializowany; Klasa ArrayList po prostu zajmuje się samymi rzeczami, zamiast używać domyślnego mechanizmu. Spójrz na metody writeObject() i readObject() w tej klasie, które są częścią standardowego mechanizmu serializacji.

Jeśli spojrzysz na źródło, zobaczysz, że writeObject() nie zapisuje tablicy kopii. Zamiast tego serializuje elementy (w tym wartości puste) po jednym na raz, aż do limitu size(). Pozwala to uniknąć narzutu serializacji tablicy, a zwłaszcza nieużywanych slotów na końcu tablicy. W przypadku deserializacji nowa tablica kopii o minimalnym wymaganym rozmiarze jest tworzona przez readObject().

5

Dlaczego to musi być przejściowe?

Czyni to, ponieważ zapewnia zwyczaj readObject i writeObject metod zrobić lepiej niż serializacji domyślnie. W szczególności metoda writeObject zapisuje tylko rozmiar i sekwencję elementów. Pozwala to uniknąć serializacji obiektu prywatnej tablicy, który 1) ma swój własny nagłówek i narzuty, a 2) jest zwykle wypełniony null s. Oszczędność miejsca może być znacząca.

(W rzeczywistości, nie sądzę, że pole ściśle potrzebuje być zadeklarowane jako transient w ogóle, ale to nie pomaga dokumentować intencję autora.)

Dlaczego” t tę klasę można serializować?

Klasa ArrayList jako całość może być serializowane . Model Object[] może być serializowany, ale zdecydował się go zaimplementować w inny sposób.


1 - W rzeczywistości zależy to od typów środowiska elementów. Na przykład, jeśli spróbujesz przekształcić do postaci szeregowej ArrayList zawierający odniesienia Thread, wówczas otrzymasz wyjątek środowiska wykonawczego dla pierwszego odwołania o wartości innej niż null.

1

Ponieważ implementuje jawną serializację. Zobacz ArrayList # writeObject.

3

ArrayList realizuje Serializable, więc może być szeregowane, właśnie dlatego prywatny tablica podkład jest transient, więc to nie jest seryjny wraz z innymi danymi w klasie, ponieważ wszystko jest obsługiwane przez ArrayList „s writeObject i readObject metody.

1

Zmienna nie jest możliwy do serializacji

  • Jeśli zmienna nie jest możliwy do serializacji, wówczas mechanizm serializacji rzuci wyjątek podczas próby serializować zmiennej. Aby tego uniknąć, możesz zadeklarować, że zmienna jest przejściowa.

Zmienna jest zbędny

  • Załóżmy, że instancja buforuje jego wynik obliczeń. Lokalnie, możemy potrzebować , aby zapisać wynik obliczeń, aby zaoszczędzić trochę czasu procesora. Ale kiedy wysyłamy obiekt przez przewód, możemy martwić się bardziej o zużywanie przepustowości i odrzucić buforowane obliczenia, ponieważ zawsze możemy je później zregenerować.

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

Powiązane problemy