/ / Por que a tabela de hash do HashMap está marcada como transitória, embora a classe seja serializável - java, serialização, dicionário, coleções, hashmap

Por que a tabela de hash do HashMap é marcada como transitória, embora a classe seja serializável - java, serialização, dicionário, coleções, hashmap

Eu estava olhando para a fonte de HashMap.

UMA HashMap implements Serializable.

Ok, isso é para que ele possa ser peristado / transmitido como um objeto.

Mas vejo que a própria hashtable está marcada como transient.

Eu não entendo isso. Se você marcar como transitório, isso não significa que deve não ser serializado?

Mas todos os dados estão na tabela. transient?

Talvez eu esteja confuso sobre como Serializable trabalho?

Respostas:

32 para resposta № 1

HashMap usa writeObject e readObject implementar serialização personalizada em vez deapenas deixando seu campo ser serializado normalmente. Ele grava o número de buckets, o tamanho total e cada uma das entradas no fluxo e se reconstrói a partir desses campos quando desserializados. Como tzaman diz, a tabela em si é desnecessária na forma serial, portanto não é serializada para economizar espaço.

Você pode ler mais sobre esses métodos e alguns outros métodos de serialização personalizada (writeReplace e readResolve) no Serializável javadoc.


12 para resposta № 2

o transient A palavra-chave indica que um campo não deve ser incluído na representação serializada de uma classe. Entry[] mesa de um HashMap é simplesmente uma estrutura de aceleração - permitepara pesquisa rápida das entradas armazenadas. A tabela inteira em si não precisa ser serializada, apenas as entradas que ela contém, pois a tabela pode ser reconstruída novamente ao desserializar da lista de entradas.