1.Serializable接口
Serializable是java提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。使用Serializable来实现序列化相当简单。只需要在类的生命中指定一个类似下面的标识即可自动实现默认的序列化过程
private static final long serialVersionUID = 123124123312L
想让一个类实现序列化,可以让其实现Serializable接口并声明一个serialVersionUID即可。
不声明serialVersionUID也可,但是会对反序列化产生影响。
下面的代码展示序列化的过程
//序列化的过程
User user = new User(0,"hfrx",true);
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("cache.txt"));
out.writerObject(user);
out.close();
//反序列化过程
ObjectInputStream in = new ObjectInputStream(new FileInputStream(cache.txt));
User newUser = (User)in.readObject();
in.close();
上述代码演示了使用Serializa方式序列化对象的典型过程,很简单,只需要把实现了Serializable接口的User对象写到文件中就可以快速恢复了,恢复后的对象newUser和user的内容完全一样,但是两者并不是同一个对象。
serialVersionUID是用来辅助序列化和反序列化过程的,原则上序列化后的数据中的serialVersionUID只有和当前类的serialVersionUID相同才能够正常的反序列化。
工作机制:序列化的时候系统会把当前类的serialVersionUID写入序列化的文件中(也可能是其他中介),当反序列化的时候系统回去检测文件中的serialVersionUID,看它是否和当前的serialVersionUID一致,如果一致就说明序列化的类的版本和当前类的版本是相同的,如果一致就说明序列化的类的版本和当前类的版本是相同的,这个时候可以成功反序列化;否则就说明当前类和序列化的类相比发生了某些变换,比如成员变量的数量,类型可能发生了改变,这个时候是无法正常反序列化的
Parcelable接口
Parcllable也是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。
系统为我们提供了许多实现了Parcelable接口的类,他们都是可以直接序列化的,比如Intent、Bundle、Bitmap等,同时List和Map也可以序列化,前提是他们里面每个元素都是可序列化的。
Binder
直观来说,Binder是Android中的一个类,它实现了IBinder接口,从IPC角度来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没有;从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager,等等)和相应ManagerService的桥梁;从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。
需要注意的是,当客户端泛起远程请求时,由于当前线程会被挂起直至服务端进程返回数据,所以如果一个远程方法是很耗时的,那么不能再UI线程中发起此远程请求;其次,由于服务端的Binder方法运行在Binder的线程池中,所以Binder方法不管时候耗时都应该采用同步的方法去实现,因为它已经运行在一个线程中了。