Parcelable和Serializable的理解

很少在博客上敲文本了,都是直接上代码就结束了,今天抽点时间写点东西。
我们知道在一般情况下,在两个或者多个Activity中传递数据中通过Intent的函数只能传递基本数据类型,那当我们想传输复杂的类的数据类型时候,我们就必须用到Parcelable或者Serializable接口经行传递数据。
Parcelable和Serializable都是能对数据经行序列化,将数据转化成字节流的方式进行传输,当这些字节流传输完毕后再对其进行反序列化,达到传输复杂数据的目的。
Serializable接口是原先Java Se中就存在的Api,但是在google公司在Android中又添加了Parcelable接口,为什么呢?第一,Parcelable比Serializable的传输速率要快很多倍,大概十倍左右(具体不知道),所以实现Parcelable接口可能提高程序的性能。第二,Parcelable可以进行IPC通讯,即跨进程通讯,这是Serializable做不到的。还有一些优点大家可以摸索,我就不累述了。
不说了,上代码

package com.example.administrator.test;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by hd on 2015/12/16.
 */
public class Student implements Parcelable {

    private String name;

    private int age;

    private String address;

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }


    public static final Creator<Student> CREATOR = new Creator<Student>() {
        @Override
        public Student createFromParcel(Parcel in) {
            Student a = new Student();
            a.setName(in.readString());
            a.setAddress(in.readString());
            a.setAge(in.readInt());
            return  a;
        }

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

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(address);
        dest.writeInt(age);
    }

    @Override
    public String toString() {
        return "name:" + name + "\n" +
                "address:" + address + "\n" +
                "age:" + age;
    }
}

可以看到,在这个bean中我实现了Parcelable接口,我们需要实现一些接口中的方法:

 public int describeContents();

对接口的描述,可以直接return 0;

public void writeToParcel(Parcel dest, int flags);

这个方法提供一个Parcel对象,在传递中就是通过将数据保存在这个对象中进行传递,所以我们要对这个Parcel进行写入数据的操作。至于flag参数只是作为一个标记,你可以在添加在数据中传递。

/**
     * 此接口必须被实现,并且需要写成public权限以及对象名为CREATOR(必须大写)
     */
 public interface Creator<T> {
        public T createFromParcel(Parcel source);
        public T[] newArray(int size);
    }

这是一个Parcelable内部的一个接口, 其中createFromParcel就是从Parcel中反序列化数据。

注意:
// 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
// android.os.BadParcelableException:
// Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.um.demo.Person
// 2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
// 3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
// 4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
// 5.反序列化对象

package com.example.administrator.test;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private Button btnSend;

    private Button btnSeriaSend;

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

        btnSend = (Button) findViewById(R.id.btnSend);

        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                Student a = new Student();
                a.setName("小明");
                a.setAddress("福建");
                a.setAge(25);
                intent.setFlags(0);
                intent.setClass(MainActivity.this, SecondActivity.class);
                intent.putExtra("hd", a);
                startActivity(intent);
            }
        });

        btnSeriaSend = (Button) findViewById(R.id.btnSeriaSend);
        btnSeriaSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                Teacher t = new Teacher();
                intent.setFlags(1);
                t.setName("小红");
                t.setAddress("浙江");
                t.setAge(24);
                intent.putExtra("hd", t);
                intent.setClass(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });


    }
}
package com.example.administrator.test;

import java.io.Serializable;

/**
 * Created by hd on 2015/12/16.
 */
public class Teacher implements Serializable {

    private String name;

    private String address;

    private int age;

    public String getName() {
        return name;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "name:" + name + "\n" +
                "address:" + address + "\n" +
                "age:" + age;
    }
}

这是Serializable的序列化,很简单,直接实现接口就行,但是不推荐噢。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.administrator.test.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tvTest"/>
</RelativeLayout>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值