Qual é o propósito da serialização em Java?

105

Eu li vários artigos sobre serialização e como é tão bom e ótimo, mas nenhum dos argumentos foi convincente o suficiente. Gostaria de saber se alguém pode realmente me dizer o que podemos realmente alcançar serializando uma classe?

m_a_khan
fonte
10
O que "não foi convincente" em seus argumentos? E por que você não aceitou nenhuma resposta às suas perguntas?
Anon.
8
Ele "não estava convencido" de que responderam suas perguntas.
Anthony Forloney
5
As respostas fornecidas foram, de fato, corretas. Se eles não funcionarem para você, responda a eles como comentários e tente resolver isso em vez de apenas ignorá-los e depois começar a criticar os outros quando eles apontarem que você não está usando o SO da maneira certa.
Anon.
4
O Anon está contribuindo para a qualidade do site, desencorajando perguntas duplicadas. É bobagem ver cinco perguntas separadas que fazem a mesma coisa. Se você não consegue obter uma resposta, bem, às vezes é assim que funciona. Se você obtiver uma resposta, mas parece que não funciona, continue a discussão nos comentários. SO não é uma caixa mágica que lhe dará uma resposta mágica se você apenas fizer a pergunta certa, ou perguntar vezes suficientes, ou chamar a atenção do especialista certo.
Chris
1
Ou: (Aceite a resposta) ou (Poste um comentário e / ou altere a pergunta explicando por que não é o que você precisa).
Anon.

Respostas:

182

Vamos definir a serialização primeiro, então podemos falar sobre por que ela é tão útil.

A serialização é simplesmente transformar um objeto existente em uma matriz de bytes. Esta matriz de bytes representa a classe do objeto, a versão do objeto e o estado interno do objeto. Essa matriz de bytes pode então ser usada entre JVMs executando o mesmo código para transmitir / ler o objeto.

Por que queremos fazer isso?

Existem vários motivos:

  • Comunicação: se você tiver duas máquinas executando o mesmo código e elas precisarem se comunicar, uma maneira fácil é uma máquina construir um objeto com informações que gostaria de transmitir e, em seguida, serializar esse objeto para a outra máquina. Não é o melhor método de comunicação, mas realiza o trabalho.

  • Persistência: se você deseja armazenar o estado de uma operação específica em um banco de dados, pode ser facilmente serializado em uma matriz de bytes e armazenado no banco de dados para recuperação posterior.

  • Deep Copy: se você precisar de uma réplica exata de um objeto e não quiser se dar ao trabalho de escrever sua própria classe clone () especializada, simplesmente serializando o objeto em uma matriz de bytes e, em seguida, desserializando-o em outra objeto atinge esse objetivo.

  • Cache: na verdade, apenas um aplicativo acima, mas às vezes um objeto leva 10 minutos para ser construído, mas levaria apenas 10 segundos para desserializar. Portanto, em vez de segurar o objeto gigante na memória, basta armazená-lo em cache em um arquivo via serialização e lê-lo mais tarde quando for necessário.

  • Sincronização cruzada de JVM: a serialização funciona em diferentes JVMs que podem estar em execução em diferentes arquiteturas.

Schmelter
fonte
62
O que diabos leva 10 minutos para ser construído?
oxbow_lakes
2
Meu ponto é (é claro) que a E / S de arquivo envolvida na serialização provavelmente diminuirá qualquer sobrecarga de criação de objeto puro. Suponho que você esteja falando sobre algo computacionalmente muito caro, como modelagem científica, mas a serialização é um mecanismo muito ruim para persistência devido à dificuldade de lidar com as alterações de esquema
oxbow_lakes
11
@oxbow_lakes Um exemplo pode ser se você mantiver um índice de um determinado conjunto de dados para pesquisa rápida. Um índice como esse pode levar muito tempo para ser construído, mas depois de compilado, ele pode ser serializado / desserializado com relativa rapidez.
David
Se a solicitação do aplicativo da web tiver que passar por todos os roteadores do globo antes de chegar ao destino, criando um objeto, retornando com o objeto usando o caminho mais longo possível, sim, pode levar 10 minutos.
Vaibs
@Schmelter, Já que você mencionou que a serialização não é o melhor método de comunicação, qual é o método adequado e melhor a ser implementado?
Ashfaque Rifaye
58

Enquanto você executa seu aplicativo, todos os seus objetos são armazenados na memória (RAM). Quando você sai, essa memória é recuperada pelo sistema operacional e seu programa essencialmente 'esquece' tudo o que aconteceu durante a execução. A serialização corrige isso permitindo que seu aplicativo salve objetos no disco para que possa lê-los de volta na próxima vez que for iniciado. Se o seu aplicativo vai fornecer alguma forma de salvar / compartilhar um estado anterior, você precisará de alguma forma de serialização.

Gordon Gustafson
fonte
2
Então, parece que é apenas uma maneira melhor e mais eficiente de gravar dados em um arquivo e lê-los quando necessário?
m_a_khan
1
Esta é a única explicação REAL. Não consigo pensar em nenhuma outra aplicação real de serialização +1
Emily
Curto e grosso. Explicação perfeita.
Yakhoob
21

Posso compartilhar minha história e espero que dê algumas idéias de por que a serialização é necessária. No entanto, as respostas à sua pergunta já são extremamente detalhadas.

Tive vários projetos que precisam carregar e ler um monte de arquivos de texto. Os arquivos continham palavras de parada, verbos biomédicos, abreviações biomédicas, palavras semanticamente conectadas entre si, etc. O conteúdo desses arquivos é simples: palavras !

Agora, para cada projeto, eu precisava ler as palavras de cada um desses arquivos e colocá-los em diferentes matrizes; como o conteúdo do arquivo nunca mudou, tornou-se uma tarefa comum, embora redundante, após o primeiro projeto.

Então, o que eu fiz foi criar um objeto para ler cada um desses arquivos e popular arrays individuais (variáveis ​​de instância dos objetos). Em seguida, serializei os objetos e, para os projetos posteriores, simplesmente os desserializei. Não precisei ler os arquivos e preencher os arrays repetidas vezes.

Rushdi Shams
fonte
1
Nesse caso, por que você precisa armazená-los em um fluxo de matriz de bytes (usando serializar), poderia ser mais simples do que apenas usar um campo temporário?
kidnan1991
3

Em essência :

Serialização é o processo de converter um conjunto de instâncias de objetos que contêm referências entre si em um fluxo linear de bytes, que pode ser enviado por meio de um soquete, armazenado em um arquivo ou simplesmente manipulado como um fluxo de dados

Veja os usos do Wiki :

A serialização tem várias vantagens. Ele fornece:

  1. um método de objetos persistentes que é mais conveniente do que gravar suas propriedades em um arquivo de texto no disco e remontá-los lendo isso de volta.
  2. um método de emissão de chamadas de procedimento remoto, por exemplo, como em SOAP
  3. um método para distribuir objetos, especialmente em componentes de software como COM, CORBA, etc.
  4. um método para detectar mudanças em dados que variam no tempo.
Piscina
fonte
1

O mais óbvio é que você pode transmitir a classe serializada por uma rede, e o receptor pode construir uma duplicata da instância original. Da mesma forma, você pode salvar uma estrutura serializada em um sistema de arquivos.

Além disso, observe que a serialização é recursiva, portanto, você pode serializar uma estrutura de dados heterogênea inteira em um swell foop, se desejar.

ddyer
fonte
0

Objetos serializados mantêm o estado no espaço, eles podem ser transferidos pela rede, sistema de arquivos, etc ... e com o tempo, eles podem sobreviver à JVM que os criou.

Às vezes, isso é útil.

David Soroko
fonte
Isso pode ser feito com um arquivo simples contendo algum texto também. É um pouco mais fácil reler um objeto serializado do que ler o estado do objeto gravado em um arquivo de texto, correto?
m_a_khan
@m_a_khan: Uau. Sim, pode ser feito com um texto simples. Mas assim que os Objetos ficarem mais complexos, ou melhor, suas estruturas (composição, herança) ficarem mais complexas, se tornará um incômodo (des) organizá-los manualmente. Imagine ter listas, conjuntos e mapas como membros de objetos.
Dirk Schumacher de
É fácil criar diferentes esquemas de serialização e, de fato, existem muitos. Por boas razões, nenhum deles resulta no caso geral, em um "texto simples"
David Soroko
0

Eu uso objetos serializados para padronizar os argumentos que passo para funções ou construtores de classe. Passar um bean serializado é muito mais limpo do que uma longa lista de argumentos. O resultado é um código mais fácil de ler e depurar.

Ron Norman
fonte
1
Na minha opinião, a searialização e o uso de um único objeto de configuração como parâmetro são bastante ortogonais. Provavelmente, este não é um caso de uso típico.
Gábor Bakos
0

Com o simples propósito de aprender (observe, eu disse aprendizado, não disse melhor, nem mesmo bom, mas apenas para entender as coisas), você poderia salvar seus dados em um arquivo de texto no computador e, em seguida, ter um programa que lê essas informações e, com base no arquivo, você pode fazer com que seu programa responda de maneira diferente. Se você fosse mais avançado, não teria necessariamente que ser um arquivo txt, mas outra coisa.

A serialização, por outro lado, coloca as coisas diretamente na linguagem do computador. É como se você estivesse contando algo em espanhol a um computador espanhol, em vez de dizer algo em francês, forçando-o a aprender francês e, a seguir, salvar as coisas em seu espanhol nativo traduzindo tudo. Não é a resposta mais intensiva em tecnologia, estou apenas tentando criar um exemplo compreensível em um formato de linguagem comum.

A serialização também é mais rápida, porque em Java, os objetos são tratados no heap e demoram muito mais do que se fossem representados como primitivos na pilha. Velocidade, velocidade, velocidade. E menos processamento de arquivo do ponto de vista do programador.

JCoder
fonte
Ao tentar colocar as coisas em inglês simples, você realmente não explicou a serialização de nenhuma maneira útil.
user3516726