Partilhar via


ISerializable Interface

Definição

A serializabilidade de uma classe é habilitada pela classe que implementa o java.

[Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")]
public interface ISerializable : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")>]
type ISerializable = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
Derivado
Atributos
Implementações

Comentários

A serializabilidade de uma classe é habilitada pela classe que implementa a interface java.io.Serializable.

<Aviso forte>: A desserialização de dados não confiáveis é inerentemente perigosa e deve ser evitada. Os dados não confiáveis devem ser cuidadosamente validados. </strong>

As classes que não implementam essa interface não terão nenhum de seus estados serializados ou desserializados. Todos os subtipos de uma classe serializável são eles próprios serializáveis. A interface de serialização não tem métodos ou campos e serve apenas para identificar a semântica de ser serializável.

Para permitir que subtipos de classes não serializáveis sejam serializados, o subtipo pode assumir a responsabilidade de salvar e restaurar o estado dos campos de pacote público, protegido e (se acessível) do supertipo. O subtipo pode assumir essa responsabilidade somente se a classe que ele estende tiver um construtor no-arg acessível para inicializar o estado da classe. É um erro declarar uma classe serializável se esse não for o caso. O erro será detectado em tempo de execução.

Durante a desserialização, os campos de classes não serializáveis serão inicializados usando o construtor no-arg público ou protegido da classe. Um construtor no-arg deve ser acessível à subclasse que é serializável. Os campos de subclasses serializáveis serão restaurados a partir do fluxo.

Ao atravessar um gráfico, um objeto pode ser encontrado que não oferece suporte a interface serializável. Nesse caso, o NotSerializableException será lançado e identificará a classe do objeto não serializável.

As classes que exigem manipulação especial durante o processo de serialização e desserialização devem implementar métodos especiais com estas assinaturas exatas:

private void writeObject(java.io.ObjectOutputStream out)
                throws IOException
            private void readObject(java.io.ObjectInputStream in)
                throws IOException, ClassNotFoundException;
            private void readObjectNoData()
                throws ObjectStreamException;

O método writeObject é responsável por gravar o estado do objeto para sua classe específica para que o método readObject correspondente possa restaurá-lo. O mecanismo padrão para salvar os campos do objeto pode ser chamado chamando out.defaultWriteObject. O método não precisa se preocupar com o estado pertencente às suas superclasses ou subclasses. O estado é salvo gravando os campos individuais no ObjectOutputStream usando o método writeObject ou usando os métodos para tipos de dados primitivos suportados por DataOutput.

O método readObject é responsável por ler o fluxo e restaurar os campos de classes. Ele pode chamar in.defaultReadObject para invocar o mecanismo padrão para restaurar os campos não estáticos e não transitórios do objeto. O método defaultReadObject usa informações no fluxo para atribuir os campos do objeto salvo no fluxo com os campos nomeados correspondentemente no objeto atual. Isso lida com o caso quando a classe evoluiu para adicionar novos campos. O método não precisa se preocupar com o estado pertencente às suas superclasses ou subclasses. O estado é restaurado lendo dados do ObjectInputStream para os campos individuais e fazendo atribuições aos campos apropriados do objeto. A leitura de tipos de dados primitivos é suportada pelo DataInput.

O método readObjectNoData é responsável por inicializar o estado do objeto para sua classe específica no caso de o fluxo de serialização não listar a classe fornecida como uma superclasse do objeto que está sendo desserializado. Isso pode ocorrer em casos em que a parte receptora usa uma versão diferente da classe da instância desserializada do que a parte remetente, e a versão do destinatário estende classes que não são estendidas pela versão do remetente. Isso também pode ocorrer se o fluxo de serialização tiver sido violado; portanto, readObjectNoData é útil para inicializar objetos desserializados corretamente, apesar de um fluxo de origem "hostil" ou incompleto.

As classes serializáveis que precisam designar um objeto alternativo a ser usado ao gravar um objeto no fluxo devem implementar esse método especial com a assinatura exata:

ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;

Esse método writeReplace é chamado por serialização se o método existir e ele seria acessível a partir de um método definido dentro da classe do objeto que está sendo serializado. Assim, o método pode ter acesso privado, protegido e privado de pacote. O acesso de subclasse a esse método segue regras de acessibilidade java.

As classes que precisam designar uma substituição quando uma instância dela é lida do fluxo devem implementar esse método especial com a assinatura exata.

ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;

Esse método readResolve segue as mesmas regras de invocação e regras de acessibilidade que writeReplace.

O tempo de execução de serialização associa a cada classe serializável um número de versão, chamado serialVersionUID, que é usado durante a desserialização para verificar se o remetente e o receptor de um objeto serializado carregaram classes para esse objeto que são compatíveis com relação à serialização. Se o receptor tiver carregado uma classe para o objeto que tem um serialVersionUID diferente daquele da classe do remetente correspondente, a desserialização resultará em um InvalidClassExceptionarquivo . Uma classe serializável pode declarar seu próprio serialVersionUID explicitamente declarando um campo chamado "serialVersionUID" que deve ser estático, final e do tipo long:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

Se uma classe serializável não declarar explicitamente um serialVersionUID, o tempo de execução de serialização calculará um valor serialVersionUID padrão para essa classe com base em vários aspectos da classe, conforme descrito na Especificação de serialização de objeto Java(TM). No entanto, é <altamente>recomendado</em> que todas as classes serializáveis declarem explicitamente valores serialVersionUID, uma vez que a computação serialVersionUID padrão é altamente sensível a detalhes de classe que podem variar dependendo das implementações do compilador e, portanto, pode resultar em s inesperados InvalidClassExceptiondurante a desserialização. Portanto, para garantir um valor serialVersionUID consistente em diferentes implementações do compilador java, uma classe serializável deve declarar um valor serialVersionUID explícito. Também é altamente recomendável que as declarações serialVersionUID explícitas usem o private modificador sempre que possível, uma vez que tais declarações se aplicam apenas aos campos class--serialVersionUID que declaram imediatamente não são úteis como membros herdados. As classes de matriz não podem declarar um serialVersionUID explícito, portanto, elas sempre têm o valor computado padrão, mas o requisito para valores serialVersionUID correspondentes é dispensado para classes de matriz.

A implementação do Android da computação serialVersionUID mudará ligeiramente para algumas classes se você estiver visando o Android N. Para preservar a compatibilidade, essa alteração só é habilitada se a versão do SDK de destino do aplicativo estiver definida como 24 ou superior. É altamente recomendável usar um campo serialVersionUID explícito para evitar problemas de compatibilidade.

<h3>Implementar Serializável Criteriosamente</h3> Consulte o capítulo do Java Efetivo sobre serialização para obter uma cobertura completa da API de serialização. O livro explica como usar essa interface sem prejudicar a capacidade de manutenção do seu aplicativo.

<h3>Alternativas recomendadas</h3><forte>JSON</strong> é conciso, legível por humanos e eficiente. O Android inclui um android.util.JsonReader streaming API e um org.json.JSONObject tree API para ler e escrever JSON. Use uma biblioteca de vinculação como GSON para ler e gravar objetos Java diretamente.

Adicionado em 1.1.

Documentação Java para java.io.Serializable.

Partes desta página são modificações baseadas no trabalho criado e compartilhado pelo Android Open Source Project e usado de acordo com os termos descritos na Creative Commons 2.5 Attribution License.

Propriedades

Handle

Obtém o valor JNI do objeto Android subjacente.

(Herdado de IJavaObject)
JniIdentityHashCode

Retorna o valor de java.lang.System.identityHashCode() para a instância encapsulada.

(Herdado de IJavaPeerable)
JniManagedPeerState

Estado do par gerenciado.

(Herdado de IJavaPeerable)
JniPeerMembers

Acesso de membros e suporte à invocação.

(Herdado de IJavaPeerable)
PeerReference

Retorna uma JniObjectReference das instâncias do objeto Java encapsulado.

(Herdado de IJavaPeerable)

Métodos

Disposed()

Chamado quando a instância tiver sido descartada.

(Herdado de IJavaPeerable)
DisposeUnlessReferenced()

Se não houver referências pendentes a este caso, então chame Dispose(), caso contrário, não faz nada.

(Herdado de IJavaPeerable)
Finalized()

Chamado quando a instância tiver sido finalizada.

(Herdado de IJavaPeerable)
SetJniIdentityHashCode(Int32)

Defina o valor retornado por JniIdentityHashCode.

(Herdado de IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

A serializabilidade de uma classe é habilitada pela classe que implementa o java.

(Herdado de IJavaPeerable)
SetPeerReference(JniObjectReference)

Defina o valor retornado por PeerReference.

(Herdado de IJavaPeerable)
UnregisterFromRuntime()

Cancele o registro dessa instância para que o tempo de execução não a retorne de chamadas futuras Java.Interop.JniRuntime+JniValueManager.PeekValue .

(Herdado de IJavaPeerable)

Métodos de Extensão

JavaCast<TResult>(IJavaObject)

Executa uma conversão de tipo verificada em tempo de execução do Android.

JavaCast<TResult>(IJavaObject)

A serializabilidade de uma classe é habilitada pela classe que implementa o java.

GetJniTypeName(IJavaPeerable)

A serializabilidade de uma classe é habilitada pela classe que implementa o java.

Aplica-se a