Mesmo que sejam implementadas as recomendações do item “Usar classes não serializáveis”, a classe ainda pode ser desserializável, o que permitiria que um adversário crie uma seqüência de bytes que corresponda a uma instância de sua classe. Isto pode ser perigoso pois o objeto desserializado pode estar num estado inconsistente ou num estado que esteja em desacordo com seu invariante (o conjunto de regras, explícitas ou não, que define os possíveis estados que o objeto pode assumir). Pode-se imaginar a desserialização como um construtor público para a sua classe, só que é um construtor que não permite o controle dos valores atribuídos às variáveis. É possível prevenir, tornando a classe impossível de desserializar uma seqüência de bytes em uma instância da sua classe. Isto pode ser feito pela definição de um método de desserialização conforme mostrado abaixo. Este método é declarado como final para evitar que seja redefinido em uma subclasse, conforme o item “Tornar todos os métodos e classes “final””. private
final void readObject(ObjectInputStream in) |
