IPC基础

IPC的一些基础概念,主要包含三方面的内容:Serializable接口、Parcelable接口以及Binder。

1、Serializable接口

Serializable是 Java提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。实现一个对象的序列化,只需要这个类实现Serializable接口并声明一个serialVersionUID即可。

public class User implements Serializable{

    private static final long serialVersionUID = 519067123721295773L;

    private int userId;
    private String userName;
    private boolean isMale;

    ......

}

只需采用ObjectOutputStream和ObjectInputStream即可进行对象的序列化和反序列化:

//序列化过程
User user = new User();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("cache.txt"));
oos.writeObject(user);
oos.close();

//反序列化
ObjectInputStream ois  = new ObjectInputStream(new FileInputStream("cache.tex"));
User newUser = (User) ois.readObject();
ois.close();
serialVersionUID有什么作用呢?

序列化的时候系统会把当前类的serialVersionUID写入序列化的文件中(也可能是其他中介 ),反序列化的时候系统会去检测文件中的serialVersionUID,看它是否和当前类的serialVersionUID一致,如果一致就说明序列化的类的版本和当前类的版本是相同的,这个时候就可以成功反序列化,否则就说明当前类和序列化的类相比发生了某些改变 ,就无法正常序列化。

另外,静态成员不属于对象,不会参加序列化过程,用transient关键字标记的成员变量不参与序列化过程。具体可以阅读Java编程思想序列化相关内容。

2、Parcelable接口

Parcelable也是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。
public class Person implements Parcelable {

    private int personId;
    public String personName;
    private boolean isMale;

    public Book book;

    private Person(Parcel in) {
        personId = in.readInt();
        personName = in.readString();
        isMale = in.readInt() == 1;
        book = in.readParcelable(Thread.currentThread().getContextClassLoader());
    }

    public Person(int personId, String personName, boolean isMale) {
        this.personId = personId;
        this.personName = personName;
        this.isMale = isMale;
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

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

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(personId);
        parcel.writeString(personName);
        parcel.writeInt(isMale ? 1 : 0);
        parcel.writeParcelable(book, 0);
    }

}

Parcel内部包装了可序列化的数据,可以在Binder中自由传输。在序列化过程中需要实现的功能有序列化、反序列化和内容描述。序列化功能由writeToParcel方法来完成,最终是通过Parcel中的一系列write方法来完成的;反序列化功能由CREATOR来完成,其内部标明了如何创建序列化对象和数组,并通过Parcel的一系列read方法来完成反序列化过程。

Parcelable的方法说明

方法功能标记位
createFromParcel(Parcel in)从序列化的对象中创建原始对象
newArray(int size)创建指定长度的原始对象数组
Person(Parcel in)从序列化的对象中创建原始对象
writeToParcel(Parcel out,int flag)将当前对象写入序列化结构中,flag=1,表示当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0PARCELABLE_WRITE_RETURN_VALUE
describeContents返会当前对象的内容描述。如果含有文件描述,返回1,否则返回0,几乎所有情况都返回0CONTENTS_FILE_DESCRIPTOR

Serializable和Parcelable如何选取呢?

Serializable是 Java中序列化的接口,开销 较大,序列化和反序列化需要大量的I/O操作。而Parcelable是 Android中的序列化方式,更适合在Android平台上,首选Parcelable方式,缺点就是使用起来比较麻烦。Parcelable主要用在内存序列化上,通过Parcelable将对象序列化到存储设备中或者在网络中传输也是可以的,但这个过程比较负责,推荐使用Serializable方式 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值