Android之IPC(一 序列化对象的使用和基础讲解)

Android之IPC(一 序列化对象的使用和基础讲解)

这之后的几篇博客,都是参照安卓开发艺术探索和自己搜索的一些东西加以讲解(顺便推荐以下这本书,真的很好,你懂的)

Serializable(java序列化接口)

使用篇(我们我们简单定义一个bean类实现Serializable即可)

public class SerializableBean implements Serializable {

    // 序列化表示
    private static final long serialVersionUID = -882536256746663652L;

    private int key;
    private String value;

    public SerializableBean(int userId, String userName) {
        this.userId = userId;
        this.userName = userName;
    }

    @Override
    public String toString() {
        return userId + "  " + userName;
    }
}

接下来就是序列化以及反序列过程

// 序列化过程
SerializableBean outSerializableBean = new SerializableBean(199140042, "JDH");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File(getCacheDir(), "cache.txt")));
out.write(outSerializableBean);
out.close();


// 反序列化过程
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(getCacheDir(), "cache.txt")));
SerializableBean inSerializableBean = (SerializableBean) in.readObject();
in.close();

这就是具体的逻辑:可能大家会有疑问序列化表示,也就是一个long类型的数能不能省略?

一般序列化的时候,这个serialVersionUID当作一个中介,比如写入当前序列化文件,反序列的时候会用的到这个数字,进行检测,判断和当前类的序列化id是否一致,一致就说明两者版本的一致性,可以成功的反序列化,否则可能会报错。

这个id值,是系统生成的一个hash值,如果没有给出这个值,当类结构发生一定的改变,系统会重新计算,如果不一样就会报错,反序列化失败。当然,如果你的类结构发生了过大的变化,也会是失败,这个值,可以保证我们最大限度的反序列化保存之前的数据。

所以,我们最好加上这个序列化值。

Parcelable(Android的序列化接口)

显而易见,在Android中这个会强大的多,下面是一个简单的演示例子。(基本就是一个模板)

public class ParcelableBean implements Parcelable {

private int key;
private String value;
private boolean isOK;

public ParcelableBean(int key, String value, boolean isOK) {
    this.key = key;
    this.value = value;
    this.isOK = isOK;
}

// 从序列化对象创建原始对象
protected ParcelableBean(Parcel in) {
    key = in.readInt();
    value = in.readString();
    isOK = in.readByte() != 0;
}

// 完成序列化功能
@Override
public void writeToParcel(Parcel dest, int flags) {
    // 当前是什么类型的值就写如什么类型的值
    dest.writeInt(key);
    dest.writeString(value);
    dest.writeByte((byte) (isOK ? 1 : 0));
}

// 返回对象描述(几乎都是返回0的,搜索得知含有文件描述符返回1)
@Override
public int describeContents() {
    return 0;
}

// 完成发序列化的功能
public static final Creator<ParcelableBean> CREATOR = new Creator<ParcelableBean>() {
    @Override
    public ParcelableBean createFromParcel(Parcel in) {
        // 从序列化对象创建原始对象
        return new ParcelableBean(in);
    }

    @Override
    public ParcelableBean[] newArray(int size) {
        // 创建一定指定大小数组
        return new ParcelableBean[size];
    }
};
}

小结:总结两者的区别和联系

联系:两者都是序列化和反序列对象的,可以在IPC(进程间通信时传递,比如Intent)
区别:Serializable使用较为简单,但是其中序列化和反序列化时候会有大量的IO操作,使用的开销比较大,Parcelable在Android平台上,虽然使用麻烦点,但是效率比较高,所以在内存中传递的时候用Parcelable比较好,同时我们也看到了,Serializable序列化写如文件,它的持久化比较好,需要保存的化用Serializable。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值