Android推荐序列化采用Parcelable,同时选择序列化的原则是:

1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable;

2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC;

3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

如何序列化

Serializable序列化很简单,只需要implements Serializable(声明一下即可)。

Android Studio类中实现Serializable自动生成serialVersionUID的方法是:

1、File -> Settings… -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without ‘serialVersionUID‘(选中)

2、进入实现了Serializable中的类,选中类名,Alt+Enter弹出提示,然后直接导入完成

Parcelable序列化稍微复杂,如果手动敲代码,要复写describeContents方法和writeToParcel方法,同时实例化静态内部对象CREATOR,实现接口Parcelable.Creator。

同时成员变量的writeSerializable和readSerializable顺序要严格一样,否则报错,当变量较多,很容易将顺序弄错,或者某个变量未write或read。

Android Studio已经解决了这个问题,我们要安装插件android parcelable code generator,然后创建实体类,写好属性(public,弃用get/set),按下Alt+Insert,选择Palcelable,选择需要的属性,按下OK即可自动生成序列化代码。

DataBinding实体类对象序列化不能采用Parcelable,原因以下三点:

1、查看ObservableField api,它只实现了Serializable序列化;

2、ObservableField定义实体变量必须为final,我们知道final变量在赋值后就不可变,这个不可变是指变量的引用、地址不会再变,但是所引用的对象的内容仍然是可变的,就是说,这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。

使用DataBinding提供的ObservableFields来创建实体类,实现双向绑定,做法是实体类的各个字段跟xml里相应的控件属性绑在一起的。我们肯定要保证绑定的对象引用始终是同一个,只是通过改变对象的内容来改变数据显示,用 name.get()获取属性值,用name.set()设置属性值。所以我们成员变量使用new 初始化后,以后不会再new,实际验证也是这样,你后面new了后,数据绑定会失败。

同时,ObservableField类注释也写明Fields of this type should be declared final because bindings only detect changes in the field’s value, not of the field itself.

java 实体类序列化以及复制 实体类实现序列化_java 实体类序列化以及复制

3、Parcelable构造函数中需要将读取到的Parcel数据赋值给成员变量,但是变量为final,是不能再被赋值的。

综上,我们序列化DataBinding实体类对象时,采用Serializable