java 序列化和反序列化

序列化使用场景

  • 通过Intent 或者 Binder 传输数据时
  • 将对象持久化到设备上

序列化类

  • serializable (java.io.Serializable)
  • parcelable (android.os.Parcelable)

Serialzable使用示例:

public class Book implements Serializable{

    private static final long serialVersionUID = 1L;

    public int id;
    public String name;


    public Book(){

    }

    public Book(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

直接继承serializable 即可,同时设置serialVersionUID。用法相对parcelable 简单很多。
serialVersionUID作用主要体现如下:

  • 序列化时会同时将serialVersionUID保存到本地,在进行反序列化的时候会去检测序列化文件的serialVersionUID是否和反序列化对象的serialVersionUID相同,如果一致则可进行反序列化。
  • Book 类中增添或者是删减属性都是没有问题,依然可以正常反序列化
  • Book 类中如果修改属性的类型,在进行反序列化会报错。
  • 如果不设置serialVersionUID的时候增添或者删减属性反序列话都会报错。

序列化,反序列化 示例:

  Book mBook;
    //反序列化
    public void unSerial(View view) throws IOException, ClassNotFoundException {
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(filepath));

        try{
            while (true) {
                mBook = (Book) inputStream.readObject();
                Log.e(TAG, mBook.toString());
            }
        }catch (EOFException e){

        }
        inputStream.close();

    }

    //序列化
    public void serial(View view) throws IOException {
        Book book = new Book(1, "android 艺术开发");
        Book book1 = new Book(1, "java");
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(filepath));
        outputStream.writeObject(book);
        outputStream.writeObject(book1);
        outputStream.close();
    }

注意反序列化获取多个Object是通过EOF异常判断的

Parcelable 使用示例:

public class People implements Parcelable {

    public int age;
    public String name;

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


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

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

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

    public static final Parcelable.Creator<People> CREATOR = new Parcelable.Creator<People>() {
        public People createFromParcel(Parcel source) {
            return new People(source);
        }

        public People[] newArray(int size) {
            return new People[size];
        }
    };
}

同样也是继承Parcelable,不过复写的方法明显要比serialable要多,这个复写的方法我一般怎么管过,都是使用androidStudio自带的插件生成的,所以虽然复写的方法要多,但是其实比serilizable要麻烦不到哪去。

插件 Android Parcelable code generator

安装插件路径示例图:

这里写图片描述

Serializable 和 Parcelable 哪个好?

serializable 是java 包下的类,而Parcelable 则是android 下,在android进行数据之间传递时如Intent这个时候是在内存中,使用parcelable会更加高效,Seriablizable会进行大量的io操作效率会低一些。但是进行序列化到本地这种操作的时候还是使用Serializable较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值