关于Serializable接口 的一些东西
学习mybatis时候发现封装的user等类都实现了Serializable接口,但查看Serializable接口的源码发现里面什么都没有。
一个成员函数或者成员变量也没有。那么这个接口的作用是什么呢。在写东西的时候很想知道,所以在网上找了一些博客看过之后,知道这个接口的作用是实现序列化。
序列化:对象的寿命通常随着生成该对象的程序的终止而终止,有时候需要把在内存中的各种对象的状态(也就是实例变量,不是方法)保存下来,并且可以在需要时再将对象恢复。
虽然你可以用你自己的各种各样的方法来保存对象的状态,但是Java给你提供一种应该比你自己写的好的保存对象状态的机制,那就是序列化。
总结:Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来(反序列化)
只要一个类实现Serializable接口,那么这个类就可以序列化了。
但这个接口里明明什么都没有,到底为什么能判定实现了它就序列化了呢?
我们这时候可以让我们的封装类不实现Serializable接口,然后运行我们的测试类,看看会发生什么。
在这里我们的测试类使用ObjectOutputStream来写入文件
@Test
public void test2(){
Account account=new Account();
account.setId(1);
account.setMoney(10.0);
account.setUid(1);
account.setUser(new User());
try {
ObjectOutputStream outputStream=new ObjectOutputStream(new FileOutputStream("test"));
outputStream.writeObject(account);
} catch (IOException e) {
e.printStackTrace();
}
}
然后运行
我们会发现这里抛出了一个 NotSerializableException 的异常,这里我们点进去看 ObjecyOutputStream.writeObject0 的源码
我们在里面发现这里判定了obj到底是什么类型的,是否是字符串,或者是数组,还是枚举还是Serializable?
如果都不是,则会抛出一个NotSerialazableException的异常。
当我们把implements Serializable加上,就会发现一切正常了
看到这里,我们就能知道,Serializable接口并不需要什么成员变量什么的,因为它只是起到一个标识的作用,告诉程序它标识的是可以被序列化的,但真正的操作不需要它完成