Androidは序列化を実現します:ParcembleとSerializableインターフェースの使い方


転載元:http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html
1.パラメータableインターフェース
Interface for clases whose instance can be written to and rested from a Pacel.Class implementing the Parecel able interface must also have a static field caled CREATOR,which is an object implement the Parecel able.interface.
2.Parcellableを実現するのは序列化のためであり、なぜ序列化するのか?
1)オブジェクトを永続的に保存し、オブジェクトのバイトシーケンスをローカルファイルに保存します.
2)対象を序列化してネットワークで伝達する.
3)プロセス間のオブジェクトの伝達は、順序化によって行われます.
3.序文化を実現する方法
Androidでは、Serializableインターフェースを実現することと、Parcembleインターフェースを実現することと、Serializableインターフェースを実現することと、Serializableインターフェースを実現することより効率が高く、Intentデータ伝送にも使えるし、プロセス間通信(IPC)にも利用できる.Serializableインターフェースを実現するのはとても簡単です.声明すればいいです.Parcebaleインターフェースを実現するのはちょっと複雑ですが、効率がもっと高いので、この方法で性能を向上させることをオススメします.
注:AndroidのIntent伝達対象は二つの方法があります.一つはBunndle.put Serializableで、もう一つはBundel.put Parcellableです.もちろんこれらのObjectには一定の条件があります.前者はSerializableインターフェースを実現しました.後者はParcebaleインターフェースを実現しました.
4.序文化の方法を選択する原則
1)メモリを使用する場合は、Pacell ableはSerializableより性能が高いので、Parcel ableの使用を推奨します.
2)Serializableは、序列化時に大量の臨時変数を発生させ、頻繁なGCを引き起こす.
3)Parcerbaleはデータをディスクに保存する場合には使用できません.Parcerbaleはデータの持続性をよく保証できないので、外部に変化がある場合には使用してください.Serializableは効率が低いにもかかわらず、Serializableを使用することを推奨します.
5.アプリケーションシーン
複数のコンポーネント(ActivityまたはService)の間でIntentを介していくつかのデータを転送する必要があります.簡単なタイプ(例えば、数字、文字列)のものは直接Intentに入れることができます.複雑なタイプは、必ずPacerbaleインターフェースを実現しなければなりません.
6、Parcellableインターフェース定義
public interface Parcelable { // public int describeContents(); // public void writeToParcel(Parcel dest, int flags); //    ,     Parcel        Parcelable       。              ,           ,             //             ,    Creator    ,                        public interface Creator<T> { public T createFromParcel(Parcel source); public T[] newArray(int size); } }

7、Parcellableステップの実現
1)implements Pacerbale
2)writeToParcel方法を書き換えて、対象を一つのParcelの対象に順番にします.つまり、クラスのデータを外部から提供されたParcelに書き込んで、包みます.転送したいデータをParcel容器に保存して、Parcel容器からデータを取得します.
3)describentets方法を書き換え、コンテンツインターフェースの説明、デフォルトは0に戻るといいです.
4)静的な内部オブジェクトを実装するCREATORインターフェースParceble.reator
public static final Parcelable.Creator<T> CREATOR
注:public static finalは一つも欠かせません.内部オブジェクトCREATORの名前も変えられません.全部大文字にしなければなりません.本インターフェースの2つの方法を書き直す必要があります.createFrom ParcelはPacel容器から転送データ値を読み取り、Parcel ableのオブジェクトにパッケージして論理層に戻り、newArayはTというタイプで、長さはsizeの配列を作成し、一言でいいです.
簡単に言いますと、writeToParcelを通じてあなたのオブジェクトをParcelのオブジェクトにマッピングし、createFroomParcelを通じてParcelのオブジェクトをあなたのオブジェクトにマッピングします.Parcelを一つの流れと見なすこともできます.対象をフローに書いて、createFroomParcelを通じてフローから対象を読み取ります.ただし、この過程はあなたが実現する必要がありますので、書く順番と読む順番は一致しなければなりません.
コードは以下の通りです
public class MyParcelable implements Parcelable { private int mData; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); } public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() { public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in); } public MyParcelable[] newArray(int size) { return new MyParcelable[size]; } }; private MyParcelable(Parcel in) { mData = in.readInt(); } }

8、Serializable実現とPacembel実現の違い
1)Serializableの実現には、implementsのみが必要です. Serializableでいいです.これは対象にマークを付けただけです.システムは自動的に順番を付けます.
2)Parcembelの実現は、implementsだけでなく、implementsも必要です. Parcembelは、クラスに静的メンバー変数CREATORを追加する必要があります.この変数は、Parcel able.reatorインターフェースを実現する必要があります.
二つのコードの比較:
1)Person類を作成し、Serializableを実現する.
public class Person implements Serializable { private static final long serialVersionUID = -7060210544600464481L; private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

2)Book類を作成し、Pacerbaleを実現する.
public class Book implements Parcelable { private String bookName; private String author; private int publishDate; public Book() { } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getPublishDate() { return publishDate; } public void setPublishDate(int publishDate) { this.publishDate = publishDate; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeString(bookName); out.writeString(author); out.writeInt(publishDate); } public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() { @Override public Book[] newArray(int size) { return new Book[size]; } @Override public Book createFromParcel(Parcel in) { return new Book(in); } }; public Book(Parcel in) { bookName = in.readString(); author = in.readString(); publishDate = in.readInt(); } }