Android 序列化

来源:互联网 发布:批处理卸载软件 编辑:程序博客网 时间:2024/06/10 02:24

序列化的目的:

1、永久性保存对象,保存对象的字节序列到本地文件中
2、让对象在网络中传递
3、让对象在IPC间传递

序列化的方法:

有两种实现序列化的方法,分别实现Serializable接口和Parcelable接口。前者是Java中的序列化接口,后者是Android自带的序列化接口。Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC,所以在使用内存时更推荐使用Parcelable。但Parcelable有一个明显的缺点是不能使用在将数据存储在磁盘上的情况。因为Parcelable本质上是为了更好的实现对象在IPC间传递,并不是一个通用的序列化机制。

代码实现:

Serializable接口的实现及运用:
Serializable的接口实现较简单,让类继承该接口即可,系统会自动将其序列化,具体代码如下

public class Book implements Serializable {    private static final long serialVersionUID = 21455356667888L;    private String mName;    private String mPrice;    public String getmName() {        return mName;    }    public void setmName(String mName) {        this.mName = mName;    }    public String getmPrice() {        return mPrice;    }    public void setmPrice(String mPrice) {        this.mPrice = mPrice;    }}

在Activity中的使用

// serializable对象传递方法public void setSerializableMethod() {    Book book = new Book();    book.setmName("王海康");    book.setmPrice("20$");    Intent intent = new Intent(this, BookTest.class);    Bundle bundle = new Bundle();    bundle.putSerializable(SER_KEY, book);    intent.putExtras(bundle);    startActivity(intent);}// serializable对象获取方法public Book getSerializableMethod(){    Book mBook = (Book )getIntent().getSerializableExtra(SER_KEY);    return mBook;}

Parcelable接口的实现和使用
1)implements Parcelable。
2)重写writeToParcel方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从Parcel容器获取数据。
3)重写describeContents方法,内容接口描述,默认返回0即可。
4)实例化静态内部对象CREATOR实现接口Parcelable.Creator 。

public class Person implements Parcelable {    private String mName;    private String mSex;    private int mAge;    public String getmName() {        return mName;    }    public void setmName(String mName) {        this.mName = mName;    }    public String getmSex() {        return mSex;    }    public void setmSex(String mSex) {        this.mSex = mSex;    }    public int getmAge() {        return mAge;    }    public void setmAge(int mAge) {        this.mAge = mAge;    }    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(mName);        dest.writeString(mSex);        dest.writeInt(mAge);    }    public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {        @Override        public Person createFromParcel(Parcel source) {            Person person = new Person();            person.mName = source.readString();            person.mSex = source.readString();            person.mAge = source.readInt();            return person;        }        //供反序列化本类数组时调用的        @Override        public Person[] newArray(int size) {            return new Person[size];        }    };

在Activity中的使用
1、传递单一对象的具体代码

// parcelable对象传递方法public void setParcelableMethod() {    Person person = new Person();    person.setmName("王海康");    person.setmSex("男");    person.setmAge(45);    Intent intent = new Intent(this, PersonTest.class);    Bundle bundle = new Bundle();    bundle.putParcelable(PAR_KEY, person);    intent.putExtras(bundle);    startActivity(intent);}// parcelable对象获取方法public Person getParcelableMethod(){    Person mPerson = (Person)getIntent().getParcelableExtra(PAR_KEY);    return mPerson;}

2、传递对象列表具体代码

// parcelable对象List传递方法public void setParcelableListMethod() {    ArrayList<Person> personList = new ArrayList<Person>();    Person person1 = new Person();    person1.setmName("王海康");    person1.setmSex("男");    person1.setmAge(45);    personList.add(person1);    Person person2 = new Person();    person2.setmName("薛岳");    person2.setmSex("男");    person2.setmAge(15);    personList.add(person2);    Intent intent = new Intent(this, PersonTest.class);    Bundle bundle = new Bundle();    bundle.putParcelableArrayList(PAR_LIST_KEY, personList);    intent.putExtras(bundle);    startActivity(intent);}// parcelable对象获取方法public ArrayList<Person> getParcelableMethod(){    ArrayList<Person> mPersonList = getIntent().getParcelableExtra(PAR_LIST_KEY);return mPersonList;}

注意事项:

1、对象序列化不会关注类中的静态变量
2、当某个字段被声明为transient后,默认序列化机制就会忽略改字段

参考文档:

浅谈Android序列化
这里写链接内容
这里写链接内容

0 0