web-dev-qa-db-ja.com

Android悪いでSerializableを使用していますか?

私は、Parcelable overSerializableの速度を称賛する多くの投稿や記事を読んでいます。インテントを介してアクティビティ間でデータを渡すためにしばらくの間両方を使用してきましたが、2つを切り替えるときに速度の違いにまだ気づいていません。私が転送しなければならないデータの典型的な量は、それぞれ2から5のフィールドを持つ5から15のネストされたオブジェクトです。

転送可能でなければならない約30のクラスがあるので、Parcelableを実装するには、メンテナンス時間を追加する多くのボイラープレートコードが必要です。私の現在の要件の1つは、コンパイルされたコードをできるだけ小さくすることです。 ParcelableではなくSerializableを使用することで、スペースをいくらか節約できると思います。

Parcelableを使用する必要がありますか、それともそのような少量のデータに対してSerializableを使用する理由はありませんか?または、Serializableを使用すべきでない別の理由はありますか?

53
Alpha Hydrae

インメモリで使用する場合、ParcelableはSerializableよりはるかに優れています。 Serializableは使用しないことを強くお勧めします。

ディスクに保存されるデータにParcelableを使用することはできません(状況が変化したときのデータの整合性について十分な保証がないため)が、Serializableは十分に遅いため、そこでも使用しないことを強くお勧めします。自分でデータを書き込む方がよいでしょう。

また、Serializableのパフォーマンスの問題の1つは、多数の一時オブジェクトをスピンして終了し、アプリで多くのGCアクティビティが発生することです。それはかなり凶悪です。 :}

64
hackbod

引き続きシリアル化を使用します。シリアライゼーションは非常に遅く、非効率的であると言う多くの人々がオンラインで目にするでしょう。それは正しいです。しかし、コンピュータープログラマーとして絶対にやりたくないことのひとつは、パフォーマンスについて絶対的なコメントをすることです。

シリアル化によってプログラムの速度が低下していないかどうかを確認してください。それが活動から活動へと移るとき、あなたは気づきますか?保存/ロードするときに気づきましたか?そうでなければ、それは大丈夫です。多くの手動シリアル化コードを使用してもフットプリントが小さくなることはないため、そこに利点はありません。では、100倍遅いとは、0.1ミリ秒ではなく10ミリ秒を意味する場合、他の方法よりも100倍遅いとしたらどうでしょうか。あなたもどちらも見ないので、誰が気にしますか?また、パフォーマンスに目に見える違いがないのに、なぜ30クラスの手動シリアル化の作成に多大な労力を費やすのでしょうか。

52
Charles

誰もが盲目的に、ParcelableはSerializableよりも優れており、高速であると述べていますが、誰も彼の発言を証明することを試みていません。これを自分でテストすることにしましたが、非常に興味深い結果が得られました。

通常Java平均でのシリアル化Androidデバイス(正しく実行された場合)は、書き込みの場合はParcelableの約3.6倍、読み取りの場合は約1.6倍高速です。

ここで私のテストプロジェクトを確認できます: https://bitbucket.org/afrishman/androidserializationtest

15
nucleo

JSONを使用してデータを文字列として渡すことを検討している人はいますか? GSONとJacksonは、ParcelableおよびSerializableの競合相手になるのに十分な効率を備えている必要があります。

0
Johan