Android-IPC之二

来源:互联网 发布:微信网站怎么制作 知乎 编辑:程序博客网 时间:2024/05/02 01:13

注意: 

静态成员变量属于类不属于对象    

transient关键字标记的成员变量不参与序列化过程.

基础概念:

对象的序列化  

Serializable

第一步 实现Serializable接口 

第二步 声明一个seralVersionUID (不是必须的) 方便我们反序列化 如果反序列化失败了就要手动的设置一个这个值

Parcelable

同Serializable一样 都是实现序列化的方法   此方法可以通过Intent和Binder传递
/** * Created by Panda_Program on 2016/12/30 0030. */public class Person implements Parcelable {    private String username;    private String nickname;    private int age;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getNickname() {        return nickname;    }    public void setNickname(String nickname) {        this.nickname = nickname;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public Person(String username, String nickname, int age) {        super();        this.username = username;        this.nickname = nickname;        this.age = age;    }    public Person() {        super();    }    /**     * 这里默认返回0即可     */    @Override    public int describeContents() {        return 0;    }    /**     * 把当前对象写入Parcel中  实现了序列化功能     */    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(username);        dest.writeString(nickname);        dest.writeInt(age);    }    /**     * 这里的读的顺序必须与writeToParcel(Parcel dest, int flags)方法中     * 写的顺序一致,否则数据会有差错,比如你的读取顺序如果是:     * nickname = source.readString();     * username=source.readString();     * age = source.readInt();     * 即调换了username和nickname的读取顺序,那么你会发现你拿到的username是nickname的数据,     * 而你拿到的nickname是username的数据     * @param source     */    //从序列化后的对象中创建原始对象    public Person(Parcel source) {        username = source.readString();        nickname=source.readString();        age = source.readInt();    }//反序列化    public static final Creator<Person> CREATOR = new Creator<Person>() {        /**         * 供外部类反序列化本类数组使用         */        @Override        public Person[] newArray(int size) {            return new Person[size];        }        /**         * 从Parcel中读取数据         */        @Override        public Person createFromParcel(Parcel source) {            return new Person(source);        }    };}
系统为我们提供了许多实现了Parcelable接口的类都是可以直接序列化的,例如 Intent Bundle Bitmap  List和Map(内部元素都必须是可序列化的)

两种序列化接口的区别:

Serializable 是Java中序列化接口 
特点:使用简单 开销很大 需要大量的IO操作
Parcelable 是android的序列化方式
特点 效率高但是使用麻烦



0 0