IPC基础

来源:互联网 发布:用java打印对称三角形 编辑:程序博客网 时间:2024/05/18 02:53

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方式 。

0 0