Java: Por que a desserialização não invoca o construtor e qual é a melhor solução alternativ
O Especificação de serialização Java para Java 1.5 disse:
Para objetos serializáveis, o construtor no-arg para o primeiro supertipo não serializável é executado. Para classes serializáveis, os campos são inicializados com o valor padrão apropriado para seu tipo. Em seguida, os campos de cada classe são restaurados chamando métodos readObject específicos da classe ou, se não estiverem definidos, chamando o método defaultReadObject. Observe que os inicializadores e construtores de campo não são executados para classes serializáveis durante a desserializaçã
No entanto, isso significa que, se colocarmos uma variável estática (por exemplo, uma variável de contador) dentro da classe, ela não será atualizada como normalment
class Foo {
static int t;
public Foo() {
t++;
}
}
public class Bar extends Foo implements Serializable {
static int t;
public Bar() {
t++;
}
}
Nesse caso, se uma instância deBar
é desserializado, então o contador paraFoo
está correto e o contador paraBar
está desativad
Eu me pergunto por que a desserialização não invoca o construtor? Como parece que, embora isso acelere um pouco na velocidade, pode causar problemas em potencial. O compilador pode ser facilmente projetado para produzir um "construtor estático" que atualiza apenas as variáveis estáticas que serão atualizadas e não depende de informações externas quando a classe é carregad
Além disso, gostaria de saber qual é a melhor maneira de evitar isso? A solução em que consigo pensar é compactar a desserialização com a operação na variável estátic
Obrigado por todas as entradas com antecedênci