2012-02-17 20 views
30

これは、より高速であるため、アンドロイドでSerializableの代わりにParcelableを使用することをお勧めします。Android Parcelable and Serializable

私の質問です:シリアル化可能な権利を使用して回避することは不可能ですか?

私はシリアライズするカスタムオブジェクトを使用している場合、のは、Personクラスがタイプparcel.write *()サポートが含まれているので、私は、以下のクラス定義このparcelableが簡単で作る

public class Person { 
    String name; 
    int Age; 
    ... 
    .... 
} 

を持っているとしましょう

私はパーにするとしていますどのように
public class PersonTwo { 
    MyCustomObj customObj; 
    String name; 
    int Age; 
    ... 
    .... 
} 

:Personクラスには、次のされているものならば、すなわちparcel.writeStringとparcel.writeInt

は、今そこにありますMyCustomObjオブジェクトを宣言しますか? もう一度シリアライザブルを使用する必要があるようですか?しかし、やはり、私はそれがシリアライズ可能を使用するのが遅いと思っていました。このケースでは使用するしかありません。

私は理解していない

私はこのケースでPersonTwoを小包だろうか

誰かが私を伝えることができますか?

+2

Serializableを使用することをお勧めします。 Nexus 5のテストによれば、Parcelableよりもはるかに高速です。 https://bitbucket.org/afrishman/androidserializationtestを参照してください。覚えておくべき主なことは、Serializableはデフォルト設定でのみ遅いということです。手動のシリアル化を使用すると、はるかに高速です。詳細は上記のリンクを確認してください。 – nucleo

答えて

2

MyCustomObjを分解可能にする必要があります。

16

あなたが探しているリンクは、Ajayのリンクです。どのようにできるのですか? さて、何を行うことができますことはあなたのCustomObject1からParcelableを実装し、それのためParcelableクラスを作成し、次にあなたが両方CustomObjectsを小包になる別のParcelableクラス内でそれParcelにそのParcelableクラスを使用することができます。

public class CustomObject1 implements Parcelable { 

    // parcelable code CustomObject1 
} 

public class CustomObject2 implements Parcelable { 

    private CustomObject1 obj1; 

    // add CustomObject1 here with getter setter 
    // parcelable code for CustomObject2 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeParcelable(obj1, flags); 
    } 
    private void readFromParcel(Parcel in) { 
     obj1 = in.readParcelable(CustomObject1.class.getClassLoader()); 
    } 
    ............ 
} 
+2

おかげで、私は答えとしてあなたとアゼイの両方を受け入れていただろうが、私は1つだけを選ぶことができるようだ。とにかくありがとうございました!! – user1118019

+1

はい、これは問題ありません。すべての終わりに、ルートオブジェクトにプリミティブ型またはストリング型が含まれているので、すべての単一のオブジェクトを必要なものにしてください。 – jonney

-1

私はParcelableが私の問題であると指摘しました。 Android 4.3では、データを アクティビティ間で渡すときに、例外がありません。 Android 4.0,4.2、または4.4では正常に動作します。 これは、Serializableに変更すると動作しますが、速度は遅くなります。

+0

これは私が経験したものです... – MartinC

+2

wheもチェックアウトできるので、問題がAndroid自体の中にある場合。 – silverado

0

すべての複合オブジェクトもParcelableでなければなりません。その場合は、オブジェクトをスキップしてから、writeToParcelメソッドを使用しないでください。