O que se entende por "serialização de objetos"? Você pode explicar isso com alguns exemplos?
java
serialization
object-serialization
Guerreiro
fonte
fonte
Respostas:
Serialização é a conversão de um objeto em uma série de bytes, para que o objeto possa ser facilmente salvo em armazenamento persistente ou transmitido por um link de comunicação. O fluxo de bytes pode ser desserializado - convertido em uma réplica do objeto original.
fonte
Você pode pensar em serialização como o processo de converter uma instância de objeto em uma sequência de bytes (que pode ser binária ou não, dependendo da implementação).
É muito útil quando você deseja transmitir dados de um objeto pela rede, por exemplo, de uma JVM para outra.
Em Java, o mecanismo de serialização é incorporado à plataforma, mas você precisa implementar a interface Serializable para tornar um objeto serializável.
Você também pode impedir que alguns dados em seu objeto sejam serializados, marcando o atributo como transitório .
Finalmente, você pode substituir o mecanismo padrão e fornecer o seu próprio; isso pode ser adequado em alguns casos especiais. Para fazer isso, você usa um dos recursos ocultos no java .
É importante notar que o que é serializado é o "valor" do objeto, ou o conteúdo, e não a definição de classe. Assim, os métodos não são serializados.
Aqui está uma amostra muito básica com comentários para facilitar sua leitura:
Quando executamos este programa, o arquivo "o.ser" é criado e podemos ver o que aconteceu por trás.
Se alterarmos o valor de: someInteger para, por exemplo , Integer.MAX_VALUE , poderemos comparar a saída para ver qual é a diferença.
Aqui está uma captura de tela mostrando exatamente essa diferença:
Você consegue identificar as diferenças? ;)
Há um campo relevante adicional na serialização Java: O serialversionUID, mas acho que isso já é muito longo para cobri-lo.
fonte
SerializationSample
SerializationSample instance = new SerializationSample();
a saída é criada e o objeto gravado nessa saída.Ousar responder à pergunta de 6 anos de idade, adicionando apenas um entendimento de alto nível para pessoas novas em Java
Convertendo um objeto em bytes
Convertendo bytes de volta em um objeto (Desserialização).
Quando queremos persistir o objeto. Quando queremos que o objeto exista além da vida útil da JVM.
ATM: Quando o titular da conta tenta sacar dinheiro do servidor por meio do caixa eletrônico, as informações do titular da conta, como detalhes da retirada, serão serializadas e enviadas ao servidor onde os detalhes são desserializados e usados para executar operações.
Implementar
java.io.Serializable
interface (interface de marcador, portanto, não há método para implementar).Persistir no objeto: Use
java.io.ObjectOutputStream
class, um fluxo de filtro que é um invólucro em torno de um fluxo de bytes de nível inferior (para gravar Object em sistemas de arquivos ou transferir um objeto achatado através de uma conexão de rede e reconstruído do outro lado).writeObject(<<instance>>)
- para escrever um objetoreadObject()
- ler um objeto serializadoQuando você serializa um objeto, apenas o estado do objeto será salvo, não o arquivo de classe ou os métodos do objeto.
Ao serializar um objeto de 2 bytes, você vê um arquivo serializado de 51 bytes.
Resposta para: Como ele se converteu em um arquivo de 51 bytes?
java.lang.Object
.Edit : Mais um bom link para ler.
Isso responderá a algumas perguntas frequentes:
Como não serializar nenhum campo na classe.
Ans: use palavra-chave transitória
Quando a classe filha é serializada, a classe pai é serializada?
Resp: Não, se um pai não estiver estendendo o campo Pais da interface serializável, não será serializado.
Quando um pai é serializado, a classe filho é serializada?
Resp: Sim, por padrão, a classe filho também é serializada.
Como evitar que a classe filho seja serializada?
Resp: a. Substitua writeObject e readObject método e throw
NotSerializableException
.b. Além disso, você pode marcar todos os campos como transitórios na classe filho.
fonte
A serialização está pegando um objeto "ativo" na memória e convertendo-o em um formato que pode ser armazenado em algum lugar (por exemplo, na memória, no disco) e posteriormente "desserializado" novamente em um objeto ativo.
fonte
Gostei da forma como @OscarRyz apresenta. Embora aqui eu continue a história da serialização que foi originalmente escrita por @amitgupta.
Mesmo sabendo sobre a estrutura da classe do robô e tendo os dados serializados, o cientista da Terra não conseguiu desserializar os dados que podem fazer os robôs funcionarem.
Os cientistas de Mars estavam aguardando o pagamento completo. Depois que o pagamento foi feito, os cientistas de Marte compartilharam o UID serialversion com os cientistas da Terra. O cientista da Terra definiu a classe de robô e tudo ficou bem.
fonte
Serialização significa objetos persistentes em java. Se você deseja salvar o estado do objeto e deseja reconstruí-lo posteriormente (pode estar em outra JVM), a serialização pode ser usada.
Observe que as propriedades de um objeto serão salvas apenas. Se você deseja ressuscitar o objeto novamente, deve ter o arquivo de classe, porque apenas as variáveis de membro serão armazenadas e não as funções de membro.
por exemplo:
O Searializable é uma interface de marcador que marca que sua classe é serializável. A interface do marcador significa que é apenas uma interface vazia e o uso dessa interface notificará a JVM de que essa classe pode ser serializada.
fonte
Meus dois centavos do meu próprio blog:
Aqui está uma explicação detalhada da serialização : (meu próprio blog)
Serialização:
Serialização é o processo de persistir o estado de um objeto. É representado e armazenado na forma de uma sequência de bytes. Isso pode ser armazenado em um arquivo. O processo para ler o estado do objeto no arquivo e restaurá-lo é chamado desserialização.
Qual é a necessidade de serialização?
Na arquitetura moderna, sempre há a necessidade de armazenar o estado do objeto e depois recuperá-lo. Por exemplo, no Hibernate, para armazenar um objeto, devemos tornar a classe Serializable. O que ele faz é que, uma vez que o estado do objeto é salvo na forma de bytes, ele pode ser transferido para outro sistema que pode ler o estado e recuperar a classe. O estado do objeto pode vir de um banco de dados ou de uma jvm diferente ou de um componente separado. Com a ajuda da serialização, podemos recuperar o estado do objeto.
Código Exemplo e explicação:
Primeiro, vamos dar uma olhada na classe Item:
No código acima, pode ser visto que a classe Item implementa Serializable .
Essa é a interface que permite que uma classe seja serializável.
Agora podemos ver uma variável chamada serialVersionUID é inicializada na variável Long. Esse número é calculado pelo compilador com base no estado da classe e nos atributos da classe. Este é o número que ajudará a jvm a identificar o estado de um objeto ao ler o estado do objeto no arquivo.
Para isso, podemos dar uma olhada na documentação oficial da Oracle:
Se você notou que existe outra palavra-chave que é transitória .
Se um campo não for serializável, ele deve ser marcado como transitório. Aqui, marcamos o itemCostPrice como transitório e não queremos que ele seja gravado em um arquivo
Agora vamos dar uma olhada em como escrever o estado de um objeto no arquivo e depois ler a partir daí.
No exemplo acima, podemos ver um exemplo de serialização e desserialização de um objeto.
Para isso, usamos duas classes. Para serializar o objeto, usamos ObjectOutputStream. Nós usamos o método writeObject para gravar o objeto no arquivo.
Para desserializar, usamos ObjectInputStream que lê o objeto no arquivo. Ele usa readObject para ler os dados do objeto no arquivo.
A saída do código acima seria como:
Observe que itemCostPrice do objeto desserializado é nulo pois não foi gravado.
Já discutimos o básico sobre serialização de Java na parte I deste artigo.
Agora vamos discutir profundamente e como funciona.
Primeiro vamos começar com o serialversionuid.
O serialVersionUID é usado como um controle de versão em uma classe Serializable.
Se você não declarar explicitamente um serialVersionUID, a JVM fará isso para você automaticamente, com base em várias propriedades da classe Serializable.
Algoritmo de cálculo de serialversionuid de Java (Leia mais detalhes aqui)
Algoritmo de serialização do Java
Coisas para manter em mente:
Os campos estáticos em uma classe não podem ser serializados.
Se o serialversionuid for diferente na classe de leitura, será lançada uma
InvalidClassException
exceção.Se uma classe implementar serializável, todas as suas subclasses também serão serializáveis.
Se uma classe tiver uma referência a outra classe, todas as referências deverão ser Serializáveis, caso contrário, o processo de serialização não será executado. Nesse caso, NotSerializableException é lançada em tempo de execução.
Por exemplo:
fonte
serialVersionUID
for diferente, ele lançará umInvalidClassException
, não umClassCastException
. Não é necessário desperdiçar todo esse espaço respeitando aserialVersionUID
computação. A documentação é citada, com tamanho excessivo, mas não está vinculada ou citada corretamente. Muita penugem aqui e muitos erros.Serialização é o processo de converter o estado de um objeto em bits, para que ele possa ser armazenado em um disco rígido. Quando você desserializa o mesmo objeto, ele retém seu estado posteriormente. Permite recriar objetos sem precisar salvar as propriedades dos objetos manualmente.
http://en.wikipedia.org/wiki/Serialization
fonte
Serialização de objetos Java
Serialization
é um mecanismo para transformar um gráfico de objetos Java em uma matriz de bytes para armazenamento (to disk file
) ou transmissão (across a network
), usando desserialização , podemos restaurar o gráfico de objetos. Os gráficos dos objetos são restaurados corretamente usando um mecanismo de compartilhamento de referência. Porém, antes de armazenar, verifique se serialVersionUID do arquivo de entrada / rede e o arquivo .class serialVersionUID são iguais. Caso contrário, jogue ajava.io.InvalidClassException
.serialVersionUID é essencial para o processo de serialização. Mas é opcional para o desenvolvedor adicioná-lo ao arquivo de origem java. Se um serialVersionUID não estiver incluído, o tempo de execução da serialização gerará um serialVersionUID e o associará à classe. O objeto serializado conterá esse serialVersionUID junto com outros dados.
Nota - É altamente recomendável que todas as classes serializáveis declarem explicitamente um serialVersionUID e
since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations
, portanto, podem resultar em conflitos inesperados de serialVersionUID durante a desserialização, causando falha na desserialização.Inspecionando classes serializáveis
Uma classe deve implementar a interface java.io.Serializable para serializar seu objeto com êxito. Serializable é uma interface de marcador e é usada para informar ao compilador que a classe que o implementa deve ser adicionada ao comportamento serializável. Aqui, a Java Virtual Machine (JVM) é responsável por sua serialização automática.
A implementação da interface Externalizável permite que o objeto assuma o controle completo sobre o conteúdo e o formato do formulário serializado do objeto. Os métodos da interface Externalizável, writeExternal e readExternal, são chamados para salvar e restaurar o estado dos objetos. Quando implementados por uma classe, eles podem escrever e ler seu próprio estado usando todos os métodos de ObjectOutput e ObjectInput. É de responsabilidade dos objetos lidar com qualquer versão que ocorra.
Somente objetos que suportam a interface java.io.Serializable ou java.io.Externalizable podem ser
written to
/read from
fluxos. A classe de cada objeto serializável é codificada, incluindo o nome e a assinatura da classe, os valores dos campos e matrizes do objeto e o fechamento de quaisquer outros objetos mencionados nos objetos iniciais.Exemplo serializável para arquivos
Exemplo serializável em rede
Distribuir o estado do objeto por diferentes espaços de endereço, em diferentes processos no mesmo computador ou até em vários computadores conectados via rede, mas que trabalham juntos compartilhando dados e chamando métodos.
@Vejo
fonte
JVM to JVM
Serialização é o processo de salvar um objeto em uma mídia de armazenamento (como um arquivo ou um buffer de memória) ou transmiti-lo por uma conexão de rede em formato binário. Os objetos serializados são independentes da JVM e podem ser reinicializados por qualquer JVM. Nesse caso, o estado dos objetos java "na memória" é convertido em um fluxo de bytes. Este tipo de arquivo não pode ser entendido pelo usuário. É um tipo especial de objeto, ou seja, reutilizado pela JVM (Java Virtual Machine). Esse processo de serializar um objeto também é chamado de esvaziar ou organizar um objeto.
O objeto a ser serializado deve implementar a
java.io.Serializable
Interface. O mecanismo de serialização padrão para um objeto grava a classe do objeto, a assinatura da classe e os valores de todos os campos não transitórios e não estáticos.ObjectOutput
interface estende aDataOutput
interface e adiciona métodos para serializar objetos e gravar bytes no arquivo. A interfaceObjectOutputStream
estendejava.io.OutputStream
e implementaObjectOutput
. Serializa objetos, matrizes e outros valores para um fluxo. Assim, o construtor deObjectOutputStream
é escrito como:O código acima foi usado para criar a instância da
ObjectOutput
classe com oObjectOutputStream( )
construtor que leva a instância doFileOuputStream
como parâmetro.A
ObjectOutput
interface é usada implementando aObjectOutputStream
classe OObjectOutputStream
é construído para serializar o objeto.Desserializando um Objeto em Java
A operação oposta da serialização é chamada desserialização, ou seja, extrair os dados de uma série de bytes é conhecida como desserialização, que também é chamada de inflar ou remover a distribuição.
ObjectInputStream
estendejava.io.InputStream
e implementa aObjectInput
interface. Deserializa objetos, matrizes e outros valores de um fluxo de entrada. Assim, o construtor deObjectInputStream
é escrito como:O código acima do programa cria a instância da
ObjectInputStream
classe para desserializar o arquivo que foi serializado pelaObjectInputStream
classe. O código acima cria a instância usando a instância daFileInputStream
classe que contém o objeto de arquivo especificado que deve ser desserializado porque oObjectInputStream()
construtor precisa do fluxo de entrada.fonte
Serialização é o processo de transformar um objeto Java em uma matriz de bytes e depois voltar ao objeto novamente com seu estado preservado. Útil para várias coisas, como enviar objetos pela rede ou armazenar coisas em cache no disco.
Leia mais neste pequeno artigo, que explica muito bem a programação de parte do processo e, em seguida, passe para o javadoc serializável . Você também pode estar interessado em ler esta pergunta relacionada .
fonte
Retorne o arquivo como um objeto: http://www.tutorialspoint.com/java/java_serialization.htm
fonte
| * | Serializando uma classe: Convertendo um objeto em bytes e bytes em objeto (Desserialização).
| => Serialização de objetos é um processo de conversão do estado de um objeto em vapor de bytes.
| => Desserialização de objeto é o processo de obter o estado de um objeto e armazená-lo em um objeto (java.lang.Object).
& nbsp & nbspSe não lançar java.io.InvalidClassException.
| => Um objeto Java é apenas serializável, se sua classe ou qualquer uma de suas superclasses
| => Os campos estáticos em uma classe não podem ser serializados.
| => Se você não deseja serializar uma variável de uma classe, use a palavra-chave transitória
| => Se uma classe implementar serializável, todas as suas subclasses também serão serializáveis.
| => Se uma classe tiver uma referência a outra classe, todas as referências deverão ser Serializáveis, caso contrário, o processo de serialização não será executado. Nesse caso,
NotSerializableException é lançada em tempo de execução.
fonte
Vou oferecer uma analogia para potencialmente ajudar a solidificar o objetivo / praticidade conceitual da serialização / desserialização de objetos .
Eu imagino serialização / desserialização de objetos no contexto de tentar mover um objeto através de um dreno de tempestade. O objeto é essencialmente "decomposto" ou serializado em versões mais modulares de si mesmo - nesse caso, uma série de bytes - a fim de ser efetivamente concedida a passagem por um meio. Em um sentido computacional, poderíamos ver o caminho percorrido pelos bytes através do dreno de tempestade como sendo semelhante aos bytes viajando através de uma rede. Estamos transmutando nosso objeto para nos adaptarmos a um modo de transporte ou formato mais desejável. O objeto serializado normalmente será armazenado em um arquivo binário que pode ser lido posteriormente, gravado ou ambos.
Talvez uma vez que nosso objeto seja capaz de passar pelo ralo como uma série de bytes decompostos, talvez desejemos armazenar essa representação do objeto como dados binários em um banco de dados ou unidade de disco rígido. O principal argumento, porém, é que, com serialização / desserialização, temos a opção de deixar nosso objeto permanecer em sua forma binária após ser serializado, ou "recuperar" a forma original do objeto executando a desserialização.
fonte