Android 序列化

原创 2016年05月06日 14:34:03

序列化的目的:

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序列化
这里写链接内容
这里写链接内容

相关文章推荐

android webservice 对象序列化例子

  • 2015年06月19日 17:07
  • 145KB
  • 下载

Android下利用SharePreference存储序列化对象的方法

在Android下做持久化的数据存储,大部分是用到了sqlite数据库或者sharepreference。当然我们为了图方便,少写sql语句,大部分都是用ORM形式的开源数据库框架,例如greenda...

诠释Android中序列化的原理与机制

  • 2017年03月26日 12:20
  • 19.73MB
  • 下载

Android中SharedPreferences和序列化结合保存对象数据

前言:        最近在做用户注册的时候,遇到了需要填写很多表单数据,不可能在一页把所有的数据都展示完全,因此采用了分页的方式,由于在用户填写数据数据之后我们需要对用户填写的数据进行暂时的记...

android Service 和 数据序列化

  • 2016年09月28日 21:36
  • 10.21MB
  • 下载

android XML文件解析和序列化 demo

  • 2016年09月23日 20:12
  • 10.54MB
  • 下载

Android开发篇之对象序列化

Android开发篇之对象序列化什么是序列化?序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。而Serializable和Parcelable接口就可以完...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 序列化
举报原因:
原因补充:

(最多只允许输入30个字)