web-dev-qa-db-ja.com

androidで使用されるParcelableとSerializationの違いは何ですか

正確に知りたい

  1. 1つのアクティビティから別のアクティビティにデータを送信するためにparcelableserializationのどちらのテクニックを使用する必要がありますか?
  2. そのうちの1つを使用してデータを相互に送信することは必須ですか?
  3. いつ使用すべきですか?
  4. そして、Javaの側面におけるそれらの正確な違いと両方のパフォーマンス。

前もって感謝します。


 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
SRam

あるアクティビティから別のアクティビティにデータを送信するために、パーセル化手法またはシリアル化手法を使用する必要があるかどうか。

intentを介して非プリミティブタイプのデータ/オブジェクトを別のアクティビティに送信する場合は、そのオブジェクトに対してSerializeを実装するか、Parcelableを実装する必要があります。パフォーマンスに影響を与えないため、推奨される手法はParcelableです。

そのうちの1つを使用してデータを相互に送信することは必須ですか? /いつ使うべきか.

これは、非プリミティブタイプのデータオブジェクトの送信にのみ必須/使用されます。

そして、Javaの側面におけるそれらの正確な違いと両方のパフォーマンス。

シリアライゼーションはパフォーマンスに影響を与えます。詳細については、このリンクをチェックしてください Android Parcelable and Serializable

19
Arun George

これらの概念は、プロセス間通信(IPC)に関連しています。

2つのアプリケーション間でデータを送信するときは、両方のアプリケーションが送信されるデータの形式を理解していることを確認する必要があります。

特に、2つのアプリケーション間でクラスやオブジェクトなどの非プリミティブデータ型の値を送信する場合は、オペレーティングシステムが理解できる形式に変換する必要があります。 O.Sはプリミティブ型(int、charなど)のみを認識します。変換の理由は、データを送信するためにO.S通信チャネルを使用する必要があるためです。

非プリミティブ型をプリミティブに変換し、いくつかの通信チャネルを介して他のアプリケーションに送信するこのプロセスは、シリアル化と呼ばれます。逆のプロセスはDe Serializationと呼ばれます。

Javaでは、IPCはシリアライゼーションのSerializableに大きく依存します。ただし、シリアライゼーションはデスクトップアプリケーションを念頭に置いて設計されています。モバイルアプリケーションでIPC= IPC=のプロセスが重すぎないことを確認します。

簡単に言えば、シリアライゼーションはIPCの重い概念です。したがって、シリアライゼーションの代わりにAndroid軽量のプロセス間通信を実現するためにバインダーを選択しました。バインダーは内部でパーセルに大きく依存し、IPCを実行します。パーセルは軽量のシリアライズ可能です。パーセルを使用することをお勧めしますオブジェクトをバイトストリームにマーシャリングします。

注:バインダーIPC=共有メモリの概念に大きく依存しているため、アプリケーション間での共有中にデータが重複しないようになっています。

27
user1923551

ParcelableとSerializationの違いについて非常に良い説明を得ました。

久しぶりの質問から始めると、他の人を助けるかもしれません:

  1. あるアクティビティから別のアクティビティにデータを送信するために、パーセル化手法またはシリアル化手法のどちらを使用する必要があるか

回答:Parcelableが最良の選択です(理由は後で説明します)。

  1. そのうちの1つを使用してデータを相互に送信することは必須ですか?

回答:はい。データ(オブジェクト)を相互に送信するには、バイトのストリームを書き込んで取得する必要があるため、パーセル化またはシリアル化のいずれかを使用して実行できます。

  1. いつ使用すべきですか?

回答:この部分はあなたが答えたものです。つまり、あるアクティビティから別のアクティビティにデータを渡します。

  1. そして、Javaの側面におけるそれらの正確な違いと両方のパフォーマンス。

回答:1. Parcelableは、Android SDKに詳しく記載されています。一方、シリアライゼーションはJavaで利用できます。

  1. Parcelableでは、開発者はマーシャリングとアンマーシャリング用のカスタムコードを記述して、シリアライゼーションと比較して作成されるガベージオブジェクトを減らします。このカスタム実装により、Parcelable over Serializationのパフォーマンスが劇的に向上します(約2倍速くなります)。

  2. シリアル化はマーカーインターフェイスであり、ユーザーが要件に応じてデータをマーシャリングできないことを意味します。シリアライゼーションでは、Java仮想マシン(JVM)でJavaリフレクションAPIを使用してマーシャリング操作を実行します。これにより、Javaオブジェクトのメンバーと動作だけでなく、大量のガベージオブジェクトが作成されるため、Parcelableに比べてシリアル化プロセスが遅くなります。

回答: このリンク

参照: シリアライズの説明

5
Bette Devine

Java Serializable:-Serializableは標準から提供されますJavaで、実装がはるかに簡単で、必要なことはシリアル化可能なインターフェイスと追加オーバーライド2つのメソッド。
Serializableの問題は、Sunの下ですべてを適切に処理しようとし、多くの反射を使用して、シリアル化されています。だからそれは肉付きの良いオブジェクトになります。

Androids Parcelable:-Android通知するプロセス間通信(AIPC)ファイルAndroidオブジェクトをマーシャリングおよびマーシャリング解除するにはどうすればよいですか。これは汎用性が低く、リフレクションを使用しないため、オーバーヘッドがはるかに少なく、はるかに高速です。

続きを読む http://www.3pillarglobal.com/blog/parcelable-vs-Java-serialization-Android-app-development

3
Sridhar Nalam

パーセル化とシリアライズの両方が、データをマーシャルおよびアンマーシャルする方法です。 in Androidこれは、コンポーネントとプロセスの間で非プリミティブデータ型を渡すために使用されます。一般に、Androidは、シリアル化可能なオブジェクトまたはパーセル可能なオブジェクトのいずれかを許可するので、あなたのメソッド。その例外はAIDLインターフェースです。オブジェクトを渡したり返すには、オブジェクトをパーセル化する必要があります。

シリアライゼーションは、リフレクションを使用してデータを自動的にマーシャルおよびアンマーシャルします。ほとんどの場合、マーカーインターフェイスを実装するだけで機能します。パーセル化では、自分でデータをマーシャルおよびアンマーシャルするコードを記述する必要があります。

したがって、それが区画化がより速い理由です。フィールドを検出するためにオブジェクトを反映する必要はありません。それが遅くなるのは反射です。

シリアライゼーションには組み込みのバージョン管理機能もあります。マーシャリングされたオブジェクトのクラスの別のバージョンにマーシャリング解除しようとすると、プロセスは予測可能な方法で失敗します。パーセル化でも同じことができますが、「バージョンフィールドをオブジェクトに追加し、マーシャリング解除時にバージョンをチェックするコードを追加して、自分で実装する必要があります。

そうは言っても、私は通常シリアル化を使用します。単純なオブジェクトでは、違いに気付かないでしょう。パフォーマンスの問題を発見した場合は、いつでも開発の後半でパーセルを使用するように変更できます。

2