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?
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?
Respostas:
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.
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.
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.
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:
- 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.
- um método de emissão de chamadas de procedimento remoto, por exemplo, como em SOAP
- um método para distribuir objetos, especialmente em componentes de software como COM, CORBA, etc.
- um método para detectar mudanças em dados que variam no tempo.
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.
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.
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.
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.