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 № 1HashMap
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.