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

questionAnswers(2)

yourAnswerToTheQuestion