序列化:就是将对象的状态信息转换为可以存储或传输的形式的过程
在我们平时开发中,我们用到序列化最多的地方就是通过intent传递对象,
如果你要在intent中传递基本数据类型以外的对象,那么该对象必须实现
Serializable或者Parcelable,否则会报错
注意
1:通过intent传递过去的对象是经过了序列化与反序列化的,虽然传送的对象和接收的对象内容相同,但它们是不同的对象,因为它们的引用是不同的
2:静态变量是不会经过序列化的,所以跨进程通信的时候静态变量是传送不过去的
1.Serializable
Serializable是java提供的序列化接口,使用起来特别简单,你只用实现这个接口就能够让这个对象支持序列化
public class MineTestSecond implements Serializable {
//注意,添加一个字段,serialVersionUID
private static final long serialVersionUID = 3275926292199431244L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
添加 serialVersionUID 的作用
如果你不添加serialVersionUID,也不会影响使用,但是存在即合理,既然存在这个字段,那么他一定是有用的,当你序列化的时候这个UID会被写入文件,当反序列话的时候会去读取这个ID,并与反序列化的类中的UID对比,如果相同,那么反序列化就成功,如果不同,反序列化就会失败。
当你不指定 serialVersionUID 的时候,系统会根据类的结构生成相应的 hash 值赋值给 serialVersionUID,但是当你的类的结构发生变化,比如增加一个字段或者减少一个字段的时候,serialVersionUID 就会发生变化,那么反序列话的时候两个类的 serialVersionUID 就不一样了,就会反序列化失败,所以手动指定 serialVersionUID,主要就是在类结构发生变化时,减少反序列化失败的几率(如果类发生了非常规的结构变化,比如类名变化、成员变量的类型变化,就算是指定了 serialVersionUID,反序列化也会失败)
AS如何生成 serialVersionUID
在eclipse中很容易的就能自动提示添加 serialVersionUID,而在AndroidStudio中却没有提示,原来是AndroidStudio的检查配置中默认是关掉对serialVersionUID的检查的,那么打开就可以了
AS > Settings > Editor > Inspections > serialization issues > Serializable class without ‘serialVersionUID’,打上对勾,点击OK,就可以了
序列化与反序列化
Serializable序列化与反序列化有很多种方法,这里示范一下通过写入文件和读取文件来实现.
序列化
File file = new File(getFilesDir()+"zhangsan.txt");
Person person = new Person("zhangsan");
ObjectOutputStream outputStream =
new ObjectOutputStream(newFileOutputStream(file));
outputStream.writeObject(person);
反序列化
ObjectInputStream objectInputStream =
new ObjectInputStream(new FileInputStream(getFilesDir()+"zhangsan.txt"));
Person person = (Person) objectInputStream.readObject();
2.Parcelable
Parcelable是Android特有的序列化方式,他的实现相对Serialiable来说更加复杂一点,但是通过AS的一个插件就可以很方便的完成。
插件名称:Android Parcelable Code Generator
安装插件:AS > Settings > Plugins > Browse Repositories > 搜索 Android Parcelable Code Generator > 安装插件后重启AS即可
Parcelable 序列化方法1:创建对象并实现Parcelable接口,右键 > Generate > Parcelable > 点击需要序列化的字段 > 点击ok
Parcelable 序列化方法2:创建对象并实现Parcelable接口,Alt + Insert > Parcelable > 点击需要序列化的字段 > 点击ok
这里面的方法就不做详细解析了,有兴趣的朋友可以去了解一下
(此截图引用自Android开发艺术探索)
3.Serializable与Parcelable的对比
Serializable:
1.Serializable是java提供的可序列化接口
2.Serializable的序列化与反序列化需要大量的IO操作,效率比较低
3.Serializable实现起来很简单
Parcelable:
1.Parcelable是Android特有的可序列化接口
2.Parcelable的效率比较高
3.Parcleable实现起来比较复杂
4.使用场景
1.Parcleable: 内存中的序列化时使用,效率更高
2.Serializable: 对象序列化到存储设备中、在网络中传输等