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?

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.


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 .


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.