Parcelable与 Serializable

 

Parcelable与 Serializable功能对比

1.Parcelable与 Serializable 都可以实现安卓数据的序列化

2.Parcelable 是安卓专用序列化方式,开销比较小,使用麻烦,效率高;Serializable是java序列化方式使用简单需要大量I/O操作,效率低

3.Serializable 序列化可以把数据存储在外存中,保存数据相对于Parcelable放在data 目录下更加持久

4.使用Serializable 需要留意serialVersionUID 当版本对不上的时候,Bean增删改或者包全类名更改,可能造成readObject出错 java.io.InvalidClassException 错误,可参见:https://blog.csdn.net/u011607686/article/details/78933856

建议:安卓尽量使用Parcelable,以减少开销,提高新能,因为大量的I/O操纵会消耗CPU,CPU使用频率过大,会影响MainActivityThread (主线程) 绘制的效率,有可能造成UI卡顿,防微杜渐.如果需要在卸载APP后继续使用本地的数据,就要考虑使用Serializable 或者把数据存储在sqlite中,记得把表建在外存中.

1.Serializable 使用

 

java Bean:

public class SBean implements Serializable {
    public String name;
    public int age;

    public SBean(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

序列化本地使用方法:

序列化

 try {
            String fileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/AMI/" + "file.text";
            File file = new File(fileName);
            SBean sBean = new SBean("李四", 24);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
            objectOutputStream.writeObject(sBean);
            objectOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

反序列化

  ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/AMI/" + "file.text"));
            SBean sBean = (SBean) objectInputStream.readObject();
            objectInputStream.close();

对象传递使用方法:

 

        Intent intent = new Intent();
        SBean sBean = new SBean("李四", 24);
        intent.putExtra("data", sBean);
        setIntent(intent);
        intent.setClass(this, SecondActivity.class);
        startActivity(intent);
 SBean data = (SBean) getIntent().getSerializableExtra("data");

2.Parcelable 使用

java Bean:

public class Bean implements Parcelable {

    public String name;
    public int age;

    public Bean(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Bean(Parcel parcel) {
        this.name = parcel.readString();
        this.age = parcel.readInt();
    }

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name);
        parcel.writeInt(age);
    }

    // 反序列过程:必须实现arcelable.Creator接口类,类名必须为CREATOR
    public static Parcelable.Creator CREATOR = new Creator() {
        @Override
        public Bean createFromParcel(Parcel parcel) {
            //序列化对应的类型
            return new Bean(parcel.readString(), parcel.readInt());
        }

        @Override
        public Bean[] newArray(int i) {
            return new Bean[i];
        }
    };




}

 

方法 功能
 createFromParcel(Parcel parcel) 从序列化后的对象中创建原始对象
newArray(int i) 创建指定长度的原始对象数组
Bean(Parcel parcel) 从序列化后的对象中创建原始对象
writeToParcel(Parcel parcel, int i)

将当前对象写入序列化结构中,其中i有两种类型:0或1.

1(PARCELABLE_WRITE_RETURN_VALUE)即标识当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况为0

describeContents() 返回当前对象描述,如果含有文件描述返回1(CONTENTS_FILE_DESCRIPTOR),否则返回0
        Bean bean = new Bean("张三", 23);
        Intent intent = new Intent();
        intent.setClass(this, SecondActivity.class);
        intent.putExtra("data", bean);
        startActivity(intent);
Bean bean = getIntent().getParcelableExtra("data");

Parcelable  序列化到本地与反序列化可参见:https://blog.csdn.net/jielundewode/article/details/78342191

你可能感兴趣的:(android)