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序列化的存储和读取

Android中序列化的实现有两种方式:Serializable接口和Parcelable接口,本文对这两种方式进行简单的总结和使用....
  • wenzhi20102321
  • wenzhi20102321
  • 2016年11月13日 11:26
  • 3395

Android中的序列化操作

1、概述对象序列化化后可以传递自定义对象数据,序列化的目的是将对象数据转换成字节流的形式。但是序列与反序列化仅处理Java变量而不处理方法,序列与反序列化仅对数据进行处理。 实现方法: 实现Seri...
  • MAGIC_JSS
  • MAGIC_JSS
  • 2016年10月21日 11:28
  • 1499

Android中两种序列化方式的比较Serializable和Parcelable

Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用者两种序列化方式。还有,我们需要对象持久化到存储设备或者通过网络...
  • wangchunlei123
  • wangchunlei123
  • 2016年05月08日 13:33
  • 10849

Android平台实现位图(Bitmap)的序列化和反序列化

android整个上层java开发框架可以分为四个方面:界面(activity和appwidget)、消息(Intent和Message)、服务(Service)和数据(Sqllite、Content...
  • jdsjlzx
  • jdsjlzx
  • 2012年12月21日 11:06
  • 4886

Android中数据序列化之Serializable与Parcelable

1.Serializable序列化Serializable是Java语言的特性之一,是将java对象转换成字节序列的过程,与之对应的是反序列化。反序列化是将字节序列转化为java对象的过程。 S...
  • true100
  • true100
  • 2017年02月24日 09:16
  • 1631

Android序列化与反序列化

1. 什么是java序列化,如何实现java序列化?我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计...
  • axi295309066
  • axi295309066
  • 2016年10月26日 21:23
  • 1896

Android中使用Serializable和Parcelable实现序列化详解(含实例)

Android中实现序列化有两种方式,一种是使用Serializable另一种就是Parcelable了。 Serializable本身就是JavaSE支持的,Parcelable是Android特...
  • L664675249
  • L664675249
  • 2015年10月25日 14:12
  • 6618

Android使用序列化接口Parcelable、Serializable

serializable: Parcelable: public class ListInfo implements Parcelable { String name; Strin...
  • qq_30716173
  • qq_30716173
  • 2015年12月27日 22:35
  • 1289

Android Parcel序列化实践

public static class APPInfo implements Parcelable{ private String mAppName; private ...
  • victory08
  • victory08
  • 2014年11月26日 23:25
  • 578

Android的序列化和反序列化

之前参加某外企公司的面试,面试官让我写一个序列化和反序列化的代码,写的不对,痛心疾首,回来好好学习! 本文转自:http://www.cnblogs.com/xdp-gacl/p/3777987.h...
  • yearningseeker
  • yearningseeker
  • 2016年07月21日 13:48
  • 217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 序列化
举报原因:
原因补充:

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