Parcelable和Serializable

1、序列化 (Serialization)
序列化是将对象的状态信息转换为可以存储或传输的形式的过程(如:Java对象转换为字节序列)。Android中序列化有两种方式:Serializable以及Parcelable。

2、Parcelable和Serializable的差异
Parcelable和Serializable
3、Serializable实现
a、Person:实现Serializable接口

变量serialVersionUID:是用来辅助序列化和反序列化的。(Android studio 自动生成:File–>Settings–>Editor–>Inspections–>Java–>Serialization issues–>Serializable class without 'serialVersionUID’勾选后apply,回到Person,类名上点击一下,等左边出现黄色警示灯,然后点击黄色警示灯,就能看到自动生成serialVersionUID的提示了。)

public class Person implements Serializable {


    private static final long serialVersionUID = 5041213889313165285L;

    private String name;
    private int age;


    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

b、SerializableActivity

public class SerializableActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_serializable);

        Person person = new Person();
        person.setAge(20);
        person.setName("张三");

        final Intent intent = new Intent(SerializableActivity.this,TotalActivity.class);
        intent.putExtra("person",person);
        findViewById(R.id.data).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(intent);
            }
        });
    }
}

c、TotalActivity

public class TotalActivity extends AppCompatActivity {

    public static final String TAG = "TotalActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_total);

        Intent intent = getIntent();
        Person p=(Person) intent.getSerializableExtra("person");

        Log.i(TAG, "Name: "+p.getName());
        Log.i(TAG, "Age:"+p.getAge());

    }

}

4、Parcelable实现
a、Person2

public class Person2 implements Parcelable {

    private String name;

    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;
    }

    private int age;

    Person2(){

    }

    protected Person2(Parcel in) {
        age = in.readInt();
        name = in.readString();
    }

    public static final Creator<Person2> CREATOR = new Creator<Person2>() {
        //反序列化时从Parcel中读取数据
        @Override
        public Person2 createFromParcel(Parcel in) {
            return new Person2(in);
        }

        @Override
        public Person2[] newArray(int size) {
            return new Person2[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    //序列化时指定将哪些数据写入Parcel中,注意:写入顺序与读取顺序务必一致
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name);
    }
}

b、ParcelableActivity

public class ParcelableActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_parcelable);

        Person2 person = new Person2();
        person.setName("李四");
        person.setAge(26);

        final Intent intent = new Intent(ParcelableActivity.this,TotalActivity.class);
        intent.putExtra("person",person);

        findViewById(R.id.data).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(intent);
            }
        });


    }
}

c、TotalActivity

public class TotalActivity extends AppCompatActivity {

    public static final String TAG = "TotalActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_total);

        Intent intent = getIntent();
        Person2 p=(Person2) intent.getParcelableExtra("person");

        Log.i(TAG, "Name: "+p.getName());
        Log.i(TAG, "Age:"+p.getAge());

    }

}