Android源码(8) --- Binder(2) 序列化

Android 开发的时候,在对数据进行持久化的时候,或者数据传递的时候会用到序列化,这时候可以对当前数据类实现Serializable或者Parcelable接口。尤其是进程间通信时,传递数据需要对对象进行序列化。

序列化

  • 序列化指的是将一个实例对象编码成字节流,并从字节流编码中重新构建对象实例的能力。将一个对象编码成字节流,称为序列化;从一个字节流中读出一个对象实例,称为反序列化。

使用场景

  • 1.持久化存储对象
  • 2.序列化对象在网络中传输
  • 3.Bundle传输对象
  • 4.进程间参传递对象(Parcelable)

Serializable和Parcelable 区别

  • Serializable

    • Java自带
    • 使用简单、代码量少,实现接口即可
    • 效率相较Parcelable低
    • 序列化时,产生大量临时变量,引起频繁GC
  • Parcelable

    • Android 专用
    • 使用稍复杂,代码量相较而言多点,需要重写相关序列化方法
    • 性能比Serializable高十倍以上
    • 对序列化完整对象进行拆解,每一部分都是Intent支持的类型。

使用

  • Serializable 只需要添加 serialVersionUID即可。也可以不添加,但是由于在修改序列化类后,反序列话检查到serialVersionUID与运行时生成serialVersionUID不一致变会报错:InvalidClassException。规范推荐添加serialVersionUID。
public class UserModel implements Serializable{
    private static final long serialVersionUID = 123456789L;
    public String userName;
    public int userId;

    public UserModel(String userName, int userId) {
        this.userName = userName;
        this.userId = userId;
    }
}
  • Parcelable
public class UserModel implements Parcelable {
    private String name;
    private int id;

    public UserModel(String name, int id) {
        this.name = name;
        this.id = id;
    }

    /**
     * 序列化
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(id);
    }

    @Override
    public int describeContents() {
        // 大都返回0即可
        return 0;
    }

    /**
     * 反序列化
     */
    public static final Creator<UserModel> CREATOR = new Creator<UserModel>() {
        @Override
        public UserModel createFromParcel(Parcel in) {
            // 反序列对象
            return new UserModel(in);
        }

        @Override
        public UserModel[] newArray(int size) {
            // 反序列数组
            return new UserModel[size];
        }
    };

    /**
     * 使用反序列化得到的 Parcel 构造对象
     */
    protected UserModel(Parcel in) {
        name = in.readString();
        id = in.readInt();
    }
}

总结

  • 在常见的Model序列化需要持久存储用Serializable,操作简单,上手快,工作效率提高。
  • 在Bundle传递对象和进程间通讯的情况下使用Parcelable(内存间的传递),性能至上。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 10,923评论 0 24
  • Android跨进程通信IPC整体内容如下 1、Android跨进程通信IPC之1——Linux基础2、Andro...
    隔壁老李头阅读 11,994评论 6 38
  • 本章关注对象序列化API,它提供了一个框架,用来将对象编码成字节流,并从字节流编码中重新构建对象。 相反的处理过程...
    Timorous阅读 258评论 0 1
  • 一、 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化de...
    步积阅读 1,457评论 0 10
  • 目录1、序列化与反序列化概念2、序列化用途3、Serializable实现序列化4、 Parcelable实现序列...
    RaphetS阅读 2,909评论 1 9