Quando devemos implementar a interface serializável?

153
public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. Quando devo implementar a Serializableinterface?
  2. Por que nós fazemos isso?
  3. Dá alguma vantagem ou segurança?
theJava
fonte
1
Para sua informação, a resposta aceita aqui é incompleta e enganosa, porque não trata das desvantagens de segurança. Consulte Java efetivo , item 86: Implementar serializável com muita cautela. A resposta de Raedwald aqui dizendo para não usar serialização é a correta.
Nathan Hughes

Respostas:

157
  1. De que se trata essa coisa de "serialização"? :

    Permite pegar um objeto ou grupo de objetos, colocá-los em um disco ou enviá-los através de um mecanismo de transporte por fio ou sem fio e, posteriormente, talvez em outro computador, reverter o processo: ressuscite o (s) objeto (s) original (is). Os mecanismos básicos são achatar o (s) objeto (s) em um fluxo unidimensional de bits e transformar esse fluxo de bits novamente no (s) objeto (s) original (is).

    Como o Transporter em Star Trek, trata-se de pegar algo complicado e transformá-lo em uma sequência plana de 1s e 0s, depois pegar essa sequência de 1s e 0s (possivelmente em outro lugar, possivelmente em outro momento) e reconstruir o original complicado " alguma coisa."

    Portanto, implemente a Serializableinterface quando precisar armazenar uma cópia do objeto, envie-a para outro processo que seja executado no mesmo sistema ou na rede.

  2. Porque você deseja armazenar ou enviar um objeto.

  3. Isso facilita o armazenamento e o envio de objetos. Não tem nada a ver com segurança.

moinudin
fonte
4
É uma prática recomendada implementar a interface seriablizble para todos os modelos de domínio ...
theJava
8
@theJava Não é uma questão de boas práticas. É uma questão de saber se você precisa ou não de séries de bytes.
moinudin
5
Ao usar o JSON, você não precisa implementar essa interface e pode simplesmente enviar essa string. Por isso, ainda não sei ao certo por que usar essa interface quando você pode usar o JSON.
Yonatan Nir
1
@YonatanNir Não sei por que usar JSON quando MsgPack, Avro, Thrift ou Protobuf são melhores para transferência de E / S.
Cricketeer
1
@YonatanNir Um esquema estritamente definido é melhor. E JSON é para ser legível, enquanto formatos codificados binários são muito mais eficientes sobre o fio
OneCricketeer
48
  1. Implemente a Serializableinterface quando desejar converter uma instância de uma classe em uma série de bytes ou quando achar que um Serializableobjeto pode fazer referência a uma instância da sua classe.

  2. Serializable As classes são úteis quando você deseja persistir instâncias delas ou enviá-las por uma conexão.

  3. Instâncias de Serializableclasses podem ser facilmente transmitidas. A serialização tem algumas conseqüências de segurança, no entanto. Leia o Java eficaz de Joshua Bloch .

Steve Emmerson
fonte
32

A resposta a esta pergunta é, talvez surpreendentemente, nunca , ou mais realista, apenas quando você é forçado a interoperabilidade com o código legado . Esta é a recomendação no Effective Java, 3rd Edition, de Joshua Bloch:

Não há razão para usar a serialização Java em qualquer novo sistema que você escreve

O arquiteto-chefe da Oracle, Mark Reinhold, afirma que a remoção do atual mecanismo de serialização Java é um objetivo a longo prazo.


Por que a serialização Java é falha

O Java fornece como parte da linguagem um esquema de serialização no qual você pode optar por usar a Serializableinterface. Esse esquema, no entanto, possui várias falhas intratáveis ​​e deve ser tratado como um experimento com falha pelos designers da linguagem Java.

  • Fundamentalmente, finge que se pode falar sobre a forma serializada de um objeto. Mas existem infinitos esquemas de serialização, resultando em infinitas formas serializadas. Ao impor um esquema, sem nenhuma maneira de alterá-lo, os aplicativos não podem usar um esquema mais apropriado para eles.
  • Ele é implementado como um meio adicional de construir objetos, que ignora qualquer pré-condição que seus construtores ou métodos de fábrica executam. A menos que um código extra de desserialização seja complicado, propenso a erros e difícil de testar, seu código provavelmente tem uma falha de segurança.
  • Testar a interoperabilidade de diferentes versões do formulário serializado é muito difícil.
  • O manuseio de objetos imutáveis ​​é problemático.

O que fazer em vez disso

Em vez disso, use um esquema de serialização que você possa controlar explicitamente. Como Buffers de Protocolo, JSON, XML ou seu próprio esquema personalizado.

Raedwald
fonte
2
não é muito especialista nesse nível, mas acha que você tem razão.
nightfury
1
Eu acho que é a melhor resposta!
jjanczur 26/03