1.首先搞清楚为什么要序列化: 为了传递对象,或将对象传化成可传输或可存储的状态;
因为intent要想传递对象的话,那么这个对象一定是实现了Serializable或Parcelable接口的;
2.他们俩有啥区别呢:
Serializable是Java自带的,将一个对象传化成可传输或可存储的状态,可以用于网络传输,以及本地存储等;Seralizable相对Parcelable而言,好处就是非常简单,只需对需要序列化的类class(JavaBean)执行就可以,不需要手动去处理序列化和反序列化的过程,所以常常用于网络请求数据处理,Activity之间传递值的使用;
Parcelable是专门为Android的序列化API,Parcelable能达到永久性的保存对象到本地文件,也能实现网络传输对象; 选择序列化的原则
①.在效率和内存优化方面优先选Parcelable,因为Serializable序列化会大量的产生临时变量,这样会频繁的GC造成卡顿;
②.Serializable简单,Parcelable复杂但是效率高,而且内存使用性能更好)
两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。
Serializable 序列化过程使用了反射技术,并且期间产生临时对象。优点代码少。是利用反射创建了一个对象,调用该类的第一个非Serializable类型的父类的无参构造方法。所以这就是为什么通过反序列化创建对象的时候,并不会执行被序列化对象的构造方法。对于实现Serializable接口的类,并不要求该类具有一个无参的构造方法, 因为在反序列化的过程中实际上是去其继承树上找到一个没有实现Serializable接口的父类(最终会找到Object),然后构造该类的对象,再逐层往下的去设置各个可以反序列化的属性(也就是没有被transient修饰的非静态属性)
Serializable:
(人不去指定,默认情况下)序列号:原则上序列化后的序列号和之前的序列号相同才能正常的被反序列化;
注意一点:应该手动指定序列号,如果不手动指定的话,在类结构发生改变的情况下,重新计算获取得新UID序列号发生了改变,导致反序列化失败
首先创建一个实现了Serializable接口的一个对象;(里面很多方法都采用了JavaBean的形式)
然后就可以在Intent中传递这个实现了Serializable接口的对象了: