6

シリアル化可能なオブジェクトまたはパーセル化可能なオブジェクトで使用Bundleする場合、マーシャリングは実際にいつ発生するのでしょうか。バンドルに入れるとすぐに?バンドルは主に2つの画面間でデータを渡すために使用されるため(ここではIPCについても話していません!)、オブジェクトは常にメモリに保持されるため、オブジェクトをマーシャリングする意味はあまりないようです。 ?

マーシャリング(Javaシリアル化またはAndroidパーセリング)は、次の場合にのみ発生すると想定するのは正しいですか?

  1. データは、RMI中など、別のプロセスに渡す必要があります。
  2. コンポーネント(アクティビティまたはサービス)が破棄され、インスタンスの状態をディスクに書き込む必要がありますか?

Androidフレームワークエンジニア(Dianne Hackbornだったと思います)が、前者の方がはるかに高速であるため、Parcelable代わりに使用する必要があると言っているのを見てきました。Serializableどれくらい速いですか?そして、オブジェクトがとにかくほとんどの時間マーシャリングされていない場合(これに関する私たちの仮定が正しいと仮定して)、これは違いを生むでしょうか?

4

2 に答える 2

7

私はそれを理解したと思います。私は基本的に最後の日と今日のほとんどをAndroidParcelBundleソースコードを介したデバッグに費やしました。その仕組みは次のとおりです。

  • バンドルは基本的には単なるラッパーですHashMapが、その内部マップとそのコンテンツをパーセル化(つまりマーシャリング)することをサポートします
  • 値をバンドルに入れると、最初にこの内部マップの区画が解除され、次に値がそのマップに入れられます。
  • マップのパーセル解除は遅延して発生します。マップにアクセスしようとしている場合にのみ、マップのパーセル解除が行われます(たとえば、bundle.putParcelable()を呼び出すことによって)。それでも、マップ自体は分割解除されるだけで、値は分割解除されません。これらの値に実際にアクセスしようとした場合にのみ(たとえば、bundle.getParcelable( "key")を使用して)、値のパーセルも解除されます。つまり、バンドル内にあるものをパーセル化する場合、これらの値に再度アクセスしなければ、パーセル化解除は発生しません。

したがって、一般的に:いいえ、値は単にバンドルに入れるだけでは分割されません。代わりに、バンドルを別のコンポーネント(アクティビティまたはサービス。Androidがそれを行う理由、技術的にはIPCが発生していないため、わかりません)に渡すとき、またはそれ以外の場合にパーセルする必要があるときに、パーセルが発生します。

于 2010-08-25T14:26:12.163 に答える
0

私はそれがすぐに起こると思います。そして、パフォーマンスの向上は、動作するためにシリアル化可能な必要なリフレクションによるものだと思います。シリアライズ可能と外部化可能のパフォーマンスの違いと同じだと思います。

于 2010-08-24T11:14:39.830 に答える