IPC 基础二 序列化 Serializable接口
上一篇文章讲了进程间通信的概念以及多进程模式的基础知识,想了解的请移步IPC基础一
序列化接口有两个,一个是Serializable接口,一个是Parcelable接口。其中Serializable是Java提供的,Parcelable是android提供的。下面我们先来看看Serizlizable接口。
Serializable接口
Serializable接口比较简单,是一个空接口,为对象提供了标准的序列化和反序列化操作。使用Serializable非常简单,只需要实现Serializable接口即可。
serialVersionUID
serialVersionUID不是实现Serializable必须的,但是serialVersionUID在序列化和反序列化的过程中非常重要。serialVersionUID是用来辅助序列化和反序列化工程的,原则上序列化后的数据的serialVersionUID只有和当前类的serialVersionUID相同才能够正常地被反序列化。
序列化的过程:序列化的时候系统把当前类的serialVersionUID写入序列号的文件中,当反序列化的时候系统去检测文件中的serialVersionUID是否与当前类的serialVersionUID一致,如果一致就说明序列化的类的版本和当前类的版本时相同的,这时候就可以成功反序列化了,否则就校验失败,无法进行反序列化。
设置serialVersionUID的方法
1、直接手动设置一个值
2、通过android studio生成
![](https://img.haomeiwen.com/i6752181/a6e3f68495b963b5.png)
然后再当前类的界面
![](https://img.haomeiwen.com/i6752181/102a0c24969f474b.png)
即可生成对应的serialVersionUID
Serializable序列化和反序列化的例子
/**
* 序列化数据
*/
private void serializableData() {
new Thread(new Runnable() {
@Override
public void run() {
Student student = new Student("xiaohong", 20);
Log.e("序列化", "存入的student: " + student);
ObjectOutputStream outputStream = null;
try {
outputStream = new ObjectOutputStream(new FileOutputStream(fileName));
outputStream.writeObject(student);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
/**
* 反序列化 java.io.FileNotFoundException: /storage/emulated/0/ remote.txt (Permission denied)
*/
private void inSerializableData() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ObjectInputStream inputStream = null;
try {
inputStream = new ObjectInputStream(new FileInputStream(fileName));
Student student = (Student) inputStream.readObject();
if (student != null) {
Log.e("序列化", "获取的student:" + student + " name: " + student.getName() + " age: " + student.getAge());
} else {
Log.e("序列化", "获取的student为空");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
我们看下日志结果
![](https://img.haomeiwen.com/i6752181/00b319dd7aea2882.png)
从打印的日志可以看出,存入时,Student的地址是4452389,获取时student的地址是ebc8266,所以存入和取出的name和age一样,但是他们已经不是同一个对象了。
后面把Parcelable接口讲完之后,再进行二者的比较,以及在使用时应该如何选择