Por que essa classe não é serializável?
-
20-09-2019 - |
Pergunta
Eu estava usando a implementação de Mersenne-Twister em http://www.math.sci.hiroshima-u.ac.jp/~m-mat/mt/versions/java/mtrandom.java como substituto de entrega para o padrão java.util.Random
classe. No entanto, quatro campos (um int, um booleano e dois byte []) são marcados como transient
. Isso significa que não consigo serializar um objeto dessa classe sem implementar a funcionalidade personalizada.
A questão é: existe alguma razão para que esses campos sejam marcados transitórios? Existe algum código que possua informações que não farão sentido quando o objeto é lido em um arquivo? Eu removi o transient
Modificador dos campos e parece funcionar bem, mas eu não o testei intensamente e, portanto, pode haver casos em que ele quebre?
Pessoalmente, não consigo ver o porquê, já que tudo o que é feito na classe é aritmético.
Solução
Provavelmente o raciocínio por trás de fazer tudo dos campos não estáticos da classe transient
era assim que o MTRandom
A classe permanece compatível binário com java.util.Random
, do qual é estendido.
Então, teoricamente, você poderia serializar um MTRandom
exemplo, e desaperializá -lo como um Random
instância e tudo funcionaria.
Se esses campos não forem transient
, então eles seriam serializados e se tornariam incompatíveis.
No entanto, até onde eu sei, remover os transientes não deve causar um problema para você.
Outras dicas
Do comentário sobre serialVersionUID
, parece que o autor não queria considerar a serialização. Adicionando transient
pode ter suprimido alguns avisos do compilador/IDE.