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,表示当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0PARCELABLE_WRITE_RETURN_VALUE
describeContents返会当前对象的内容描述。如果含有文件描述,返回1,否则返回0,几乎所有情况都返回0CONTENTS_FILE_DESCRIPTOR

Serializable和Parcelable如何选取呢?

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

以上是关于IPC基础的主要内容,如果未能解决你的问题,请参考以下文章

部标808协议模拟终端的设计和开发

基于BootStrap框架构建快速响应的GPS部标监控平台

车辆监测设备研发中,部标808消息头解析

GB35658较796新增检测项部标平台

部标北斗GPS车辆调度管理系统软件

基于JT/T 1078协议设计和开发部标视频服务器