Android-IPC之二

本文介绍了序列化的两种方式:Java 的 Serializable 和 Android 特有的 Parcelable。详细解析了它们的特点及使用方法,并通过一个具体的 Person 类实例展示了 Parcelable 接口的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意: 

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

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的序列化方式
特点 效率高但是使用麻烦



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值