Serializable的作用
应用场景
- 互联网中应用的一些场景需要将内存中的java对象持久化到磁盘,这样做的目的,可以将一些暂时不用的对应可以转存到廉价的磁盘中,到需要使用的时候再从磁盘通过反序列成内存中的对象;
- 另外一种目的,在远程调用的场景中,通过网络传输对象的场景,必须微服务的场景中,各各服务之间的参数传递使用序列化后的字节流通过网络传输值对方服务中。
使用方法
需要支持序列话的对象需要实现Serializable
那来验证下,没有实现Seriablizable的对象是不是就不能序列化呢?
import java.io.Serializable;
public class User implements Serializable {
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;
}
}
public class Test4 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 序列化
serialize();
// 反序列化
unSerialize();
}
private static void serialize() throws IOException {
User user = new User();
user.setAge(18);
user.setName("harlan");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("User.data"));
oos.writeObject(user);
oos.flush();
oos.close();
}
private static void unSerialize() throws IOException, ClassNotFoundException {
ObjectInputStream ooi = new ObjectInputStream(new FileInputStream("User.data"));
Object obj = ooi.readObject();
User user1 = (User) obj;
System.out.println(user1.getAge() +","+ user1.getName());
ooi.close();
}
}
运行结果:
可以看到工程根路径下面多了一个文件,这个文件就是user序列化对象,然后看输出时没有问题的。
那么现在修改User类,不再实现Serializable接口,会怎么怎么样的?
终端报错,看报错信息显示,writeObject方法报错,也就验证了序列化失败。
然后,序列化需要使用到一个常量
private static final long serialVersionUID = -xxx;
这个字段是做什么的呢?实现Serializable接口的目的是要告诉jvm可以支持序列话和反序列话。那么serialVersionUID就是告诉jvm当前类的版本的;如果显示生成了serialVersionUID的值,反序列化时如果serialVersionUID不一致的话,那么就会反序列化失败。请看例子:
先序列化:
反序列化:
终端报错了,发现反序列化失败,版本号不一致,也就说明了这个版本号如果显示写上的话,jvm会校验这个版本号的。如果不显式声明的话,那么就不会校验,但是会默认生产一个版本号。