Porque nem tudo é Serilizable?

Esses dias, precisando enviar via Socket uma BuferedImage, fiquei pensando em uma questão que me intrigou.Qual o motivo que impede que certas classes implementem Serializable?

Certo, talvez alguns objetos guardem muitos estados em variáveis transient (que não fazem parte da serialização) e, de certas forma, serializá-los não teria sentido…Mas por que, por exemplo, objetos java.awt.BufferedImage simplesmente não implementam a interface? Facilitaria uma série de coisas…

cara mas isso é fácil… é só você pegar os bytes da imagem e enviar em um stream, não tem segredo

No caso do BufferedImage, existem diversas formas de transforma-la dados binários. Existem ordenações de bits de cor, mecanismos de compressão, etc.
O método ImageIO.write faz isso, permitindo, por exemplo, que você escolha o formato da imagem (png, jpg, gif, etc). Assim, você pode serializar a sua imagem para dentro de um stream com muito mais flexibilidade do que se o BufferedImage fornecesse uma única implementação de Serializable.

Na verdade a transmissão da imagem via socket já foi resolvida…

A minha dúvida é realmente a dúvida do título…Porque algumas classes não são Serializable? O que impediria um objeto de implementar a interface Serializable (e, conseqüentemente, ser serializado)?

Tecnicamente, nada impede.

Agora, vale a pena investir para tornar certas classes serializáveis?

Se tudo fosse Serializable, não perderia o sentido o Serializable?

Uma coisa coisa para ficar atento é que, uma vez que uma classe se torna serializable, fica mais difícil fazer herda-la corretamente.

Isso porque assume-se que os filhos dessa classe também são serializable, já que os filhos também implementam as interfaces do pai. E, por isso, aquele warning mala de que você não definiu o “serial version UID”. Definir um ID desses sem se preocupar com serialização, só para se livrar do warning, também não serve. Se for fazer isso, desligue o warning.

A mesma coisa vale no caso de thread-safety. Por que não tornar uma API inteira thread-safe? Porque isso reduz as chances de extensão da API. Quanto mais tranqueira você impõe para as classes pai, mais difícil fica implementar filhos e menos extensível e mais sujeito a erros fica o uso da sua API.

É…Eu até tinha em mente as restrições impostas a classes derivadas (implementações, extensões)…Mas realmente não havia pensado no quanto isso poderia se tornar problemático…