IPC基础
Posted Young_xiaoT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,表示当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0 | PARCELABLE_WRITE_RETURN_VALUE |
describeContents | 返会当前对象的内容描述。如果含有文件描述,返回1,否则返回0,几乎所有情况都返回0 | CONTENTS_FILE_DESCRIPTOR |
Serializable和Parcelable如何选取呢?
Serializable是 Java中序列化的接口,开销 较大,序列化和反序列化需要大量的I/O操作。而Parcelable是 android中的序列化方式,更适合在Android平台上,首选Parcelable方式,缺点就是使用起来比较麻烦。Parcelable主要用在内存序列化上,通过Parcelable将对象序列化到存储设备中或者在网络中传输也是可以的,但这个过程比较负责,推荐使用Serializable方式 。
以上是关于IPC基础的主要内容,如果未能解决你的问题,请参考以下文章