2012-02-04 11 views
23

szukałem u źródeł HashMap.Dlaczego tabela hash HashMap oznaczone jako przemijające choć klasa jest serializable

HashMapimplements Serializable.

OK, to tak, że może zostać zmieniony/przesłany jako obiekt.

Ale widzę, że sam hashtable jest oznaczony jako transient.

Nie rozumiem tego. Jeśli oznaczysz go jako przejściowy, czy nie oznacza to, że powinien on być , a nie zostać zserializowany?

Ale wszystkie dane są w table.So dlaczego jest transient?

Być może jestem mylić na temat Serializable pracach?

Odpowiedz

31

HashMap używa writeObject i readObject do implementacji niestandardowej serializacji zamiast zwykłego pozwalania, aby jej pole było serializowane normalnie. Zapisuje liczbę segmentów, całkowity rozmiar i każdy z wpisów do strumienia i odbudowuje się z tych pól po deserializacji. Jak mówi tzaman, sama tabela jest niepotrzebna w formie szeregowej, więc nie jest serializowana, aby zaoszczędzić miejsce.

Możesz przeczytać więcej o tych metodach i innych metodach serializacji niestandardowej (writeReplace i readResolve) w javadoc Serializable.

+0

Widzę te metody. Zastanawiam się, dlaczego tak działa? Czy jest jakiś powód? – Cratylus

+9

Kod skrótu obiektów może się zmieniać między uruchomieniami programu - na przykład, jeśli hashCode() używa domyślnej implementacji obiektu - tak, aby tablica asocjacyjna była odbudowywana podczas deserializacji. –

11

transient słów kluczowych wskazuje, że pole nie powinno być zawarte w odcinkach reprezentacji klasy. Tabela Entry[] z HashMap jest po prostu strukturą przyspieszenia - pozwala na szybkie wyszukiwanie zapisanych wpisów. Cała sama tabela nie musi być przekształcana do postaci szeregowej, tylko zawarte w niej wpisy, ponieważ tabela może zostać ponownie odbudowana podczas deserializacji z listy wpisów.

+0

Czy jest to wielkość lub szybkość? Ponieważ w deserializacji kończy się tabela o tej samej wielkości. – Cratylus

+1

Rozmiar. Tabela "Wejście" jest większa niż lista kluczy. – tzaman

Powiązane problemy