IPC基础

本文介绍 Java 中 Serializable 接口与 Android 中 Parcelable 接口的区别与应用场景。Serializable 适用于对象持久化与网络传输,而 Parcelable 更适用于 Android 平台内部的数据交换,尤其是在内存中的序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Serializbale接口,Parceable接口可以完成对对象的序列化和反序列化。
把对象转化为字节序列称为对象的序列化
把字节序列转化为对象称为对象的反序列化。

对象的序列化场景:
把一个对象持久化到硬盘上,比如存放到文件中。
在网络上传送对象的字节序列。(android中,就是通过Intent,Binder来传送)

1,Serializbale

Serializbale是Java中的一个序列化接口,是一个空接口。
在类中实现Serializbale接口,那么类的对象就实现了序列化和反序列化。

对象的序列化:

Person person=new Person("ronaldo",24);
        try {
            ObjectOutputStream obs=new ObjectOutputStream(new FileOutputStream("cache.txt"));
            obs.writeObject(person);
        } catch (Exception e) {
            e.printStackTrace();
        }

对象的反序列化:

try {
            ObjectInputStream ois=new ObjectInputStream(new FileInputStream("cache.txt"));
            Person person=(Person)ois.readObject();
            System.out.println(person.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

serialVersionUID的作用

序列化时,会把serialVersionUID这个值写入到文件中。而在反序列化时,会根据文件的serialVersionUID值和类的serialVersionUID值进行对比,如果一致,反序列化成功,否则反序列化失败。
而如果不写serialVersionUID的值,会根据类的成员生成hash值作为该类的serialVersionUID值。这时,如果改动了类,serialVersionUID值就会发生变化。所以如果不定义serialVersionUID的值,会加大对象反序列失败的概率。
极端情况下,类名或类的构造函数发生了变化,设定了serialVersionUID值,反序列化也会失败。

2,Parcelable
android中提供的序列化接口。

public class Student implements Parcelable{

    private String name;
    private int age;
    private boolean isMale;

    //Parcel一些read方法完成反序列化
    protected Student(Parcel in) {
        name = in.readString();
        age = in.readInt();
        isMale = in.readByte() != 0;
    }

    //反序列化是由CREATOR完成
    public static final Creator<Student> CREATOR = new Creator<Student>() {
        //反序列化,序列化对象----->原始对象
        @Override
        public Student createFromParcel(Parcel in) {
            return new Student(in);
        }

        //创建指定长度的原始对象数组    
        @Override
        public Student[] newArray(int size) {
            return new Student[size];
        }
    };

    //内容描述
    //几乎所有的情况下都返回0,只在当前对象中存在文件描述符时,返回1
    @Override
    public int describeContents() {
        return 0;
    }

    //序列化   原始对象------>序列化对象
    //Parcel中包装了可序列化的数据,
    //换句话说,数据包装为Parcel对象,就实现了序列化
    //它有很多write方法
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeByte((byte) (isMale ? 1 : 0));
    }
}

选择哪种序列化的考虑:
Seralizbale序列化,需要进行大量的IO操作,使用简单但开销很大。
Parceable序列化,适用于android平台,使用麻烦但效率高。
Parceable序列化,主要用在内存上的序列化。
将对象序列化到硬盘上或者将对象序列化成字节序列传输到网络上这种序列化,建议使用Seralizbale。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值