Qual é a diferença entre Parcelable e Serialization usado no Android

Eu quero saber exatamente

  1. se devo usar a técnica parcelable ou serialization para enviar dados de uma atividade para outra?
  2. é obrigatório usar um deles para enviar dados de um para outro?
  3. quando devo usá-los?
  4. e a diferença exata entre eles e o desempenho de ambos em aspectos java.

Desde já, obrigado.


 public class GetSetClass implements Serializable {
    private int dt = 10;

    /** pass any object, drwabale */
    public int getDt() {
        return dt;
    }

    public void setDt(int dt) {
        this.dt = dt;
    }
}
32
adicionado editado
Visualizações: 1
Qual é a necessidade de serialização de objetos no android? podemos não executar a tarefa sem serializar os objetos?
adicionado o autor SRam, fonte
adicionado o autor verisimilitude, fonte
Use letras maiúsculas para iniciar um nome de classe ( GetSetClass ou Getsetclass ).
adicionado o autor keyser, fonte

5 Respostas

Esses conceitos estão relacionados à comunicação entre processos (IPC).

Ao enviar dados entre dois aplicativos, precisamos nos certificar de que os dois aplicativos devem entender o formato dos dados que estão sendo enviados.

Especialmente quando você está enviando valores de tipo de dados não primitivos como classes e objetos entre dois aplicativos, temos que convertê-los em formato compreensível do sistema operacional. O.S entende apenas tipos primitivos (ints, chars etc). O motivo da conversão é o canal de comunicação O.S para transmitir os dados.

Esse processo de converter tipos não primitivos em primitivos e enviar para outro aplicativo através de algum canal de comunicação é chamado de serialização. O processo inverso é chamado como De serialização.

Em Java, o IPC depende muito dos Serializables para serialização. Mas a serialização é projetada para manter os aplicativos de desktop em mente. Quando você está fazendo IPC em aplicativos móveis, temos que ter certeza de que o processo de IPC não seja muito pesado.

Em termos simples, a serialização é um conceito pesado para o IPC. Por isso, no lugar da serialização, o Android optou por Binders para obter uma comunicação leve entre processos. Ligantes internamente depende muito de parcelas, para fazer o IPC. Os pacotes são serializáveis ​​leves. É preferível usar pacotes para empacotamento de objetos em fluxos de bytes.

Nota: O IPC do Binder depende muito do conceito de memória compartilhada para garantir que não haja muita duplicação de dados durante o compartilhamento entre os aplicativos.

25
adicionado
Eu não tenho ideia de por que essa resposta não tem nenhum valor positivo até agora, é bem completa e, para ser honesta, uma das melhores para mim.
adicionado o autor GoRoS, fonte
@vsvankhede Bem, parece que há um tempo e lugar para tudo e atualmente é o mais votado.
adicionado o autor GoRoS, fonte

se devo usar a técnica de parcelável ou de serialização para enviar dados de uma atividade para outra.

Se você está enviando um tipo/objeto de dados não-primitivos para outra atividade através da intenção você tem que Serialize ou implementar Parcelable para aquele objeto . A técnica preferida é Parcelable , uma vez que não afeta o desempenho.

é obrigatório usar um deles para enviar dados de um para outro./quando devo usá-los?

É apenas obrigatório/usado para enviar objetos de dados do tipo não primitivos.

e a diferença exata entre eles e o desempenho de ambos em aspectos java.

Serialization does impact the performance. For more details check this link Android Parcelable and Serializable

19
adicionado
@hi arun George, .. por que devo usar serialização apenas para tipos de dados não primitivos? e por que é obrigatório apenas para tipos de dados não primitivos?
adicionado o autor SRam, fonte
ok obrigado por responder mais uma pergunta ..Quando devemos usar o Bundle para o envio de dados e qual a necessidade de colocar objeto no Bundle intent.putExtras (id String, PRIMITIVE_DATA_TYPE) se r usando serialização para o envio de dados ..
adicionado o autor SRam, fonte
Os tipos de dados primitivos podem ser passados ​​de uma atividade para outra usando intent.putExtras (ID da cadeia, PRIMITIVE_DATA_TYPE) e acessados ​​na outra outra atividade usando o equivalente getMethod() para esse tipo. Mas esse não é o caso dos tipos de dados definidos pelo usuário e, portanto, você tem que usar a serialização ou Parcelable .
adicionado o autor Arun George, fonte

Tem uma explicação muito boa da diferença entre Parcelable e Serialization.

Para começar com a sua pergunta, embora tenha sido há muito tempo, pode ajudar os outros:

      
  1. se devo usar a técnica parcelável ou de serialização para enviar dados de uma atividade para outra?
  2.   

Resposta: Parcelable é a melhor escolha (por que explicado mais tarde).

      
  1. é obrigatório usar um deles para enviar dados de um para outro?
  2.   

Resposta: Sim, como enviar dados (objeto) de um para outro requer fluxos de bytes para serem gravados e recuperados e isso pode ser feito através de parcelável ou serialização.

      
  1. quando devo usá-los?
  2.   

Resposta: Esta parte você respondeu, ou seja, passando dados de uma atividade para outra.

      
  1. e a diferença exata entre eles e o desempenho de ambos em aspectos java.
  2.   

Resp: 1. Parcelable está bem documentado no Android SDK; serialização, por outro lado, está disponível em Java.

  1. Em Parcelable, os desenvolvedores gravam código personalizado para marshaling e unmarshaling, criando menos objetos de lixo em comparação com Serialization. O desempenho de Parcelable over Serialization melhora drasticamente (cerca de duas vezes mais rápido), devido a essa implementação personalizada.

  2. Serialização é uma interface de marcador, o que implica que o usuário não pode empacotar os dados de acordo com seus requisitos. Na Serialização, uma operação de empacotamento é executada em uma Java Virtual Machine (JVM) usando a API de reflexão Java. Isso ajuda a identificar o membro e o comportamento dos objetos Java, mas também acaba criando muitos objetos de lixo. Devido a isso, o processo de serialização é lento em comparação com Parcelable.

Answer taken from: this link

See also:serialization explained

5
adicionado

Java Serializable:- Serializable comes from standard Java and is much easier to implement all you need to do is implement the Serializable interface and add override two methods.
The problem with Serializable is that it tries to appropriately handle everything under the sun and uses a lot reflection to make determine the types that are being serialized. So it becomes a beefy Object.

Androids Parcelable:- Android Inter-Process Communication (AIPC) file to tell Android how is should marshal and unmarshal your object.It is less generic and doesn't use reflection so it should have much less overhead and be a lot faster.

Read More from http://www.3pillarglobal.com/blog/parcelable-vs-java-serialization-android-app-development

3
adicionado
Destacar o problema com a serialização dá esta resposta meu +1
adicionado o autor Richard Le Mesurier, fonte

Tanto o parcelamento quanto a serialização são formas de empacotar e descompactar dados. no android isso é usado para passar tipos de dados não-primitivos entre componentes e processos. Em geral, o Android permite objetos serializáveis ​​ou parceláveis, para que você possa escolher o seu método. a exceção a isso é com interfaces AIDL. objetos devem ser parceláveis ​​para serem passados ​​/ retornados.

serialização usa a reflexão para automaticamente organizar e unmarshal dados. na maioria dos casos, a implementação da interface do marcador é suficiente para que funcione. com parceling, você tem que escrever o código para marshall e unmarshal os dados você mesmo.

e, portanto, é por isso que o parcelamento é mais rápido. o objeto não precisa ser refletido para descobrir os campos. é o reflexo que torna lento.

serialização também possui versionamento embutido ... se você tentar descomprimir uma versão diferente da classe do objeto que foi empacotada, o processo falhará de uma maneira previsível. com o parcelamento, você pode fazer a mesma coisa, mas precisa implementá-lo adicionando um "campo de versão ao seu objeto e um código que verifica a versão ao unmarhsaling.

Dito isto, eu normalmente uso serialização. com objetos simples você não notará a diferença. você sempre pode mudar para usar o parcelamento mais tarde no desenvolvimento se descobrir problemas de desempenho.

2
adicionado