一、序列化作用:
1系列化是干什么的?
序列化简单来说就保存对象在内存中的状态也可以说是实例化变量。这是Java提供的用来保存 Object state,一种保存对象状态的机制。只有实现了serializable接口的类的对象才能被实例化。
2什么情况下会用到序列化?
1当你想把内存中的对象写入到硬盘时
2当你想用套接字在网络上传输对象时
3当你想通过RMI调用对象时
(RMI是什么东西?):RMI总结来说就是远程调用对象,在一个jvm上调用另一个jvm的对象。
3序列化需要注意的事项
1序列化只保存对象的状态,而不管对象的方法。
2当一个父类实现了序列化,它的子类也自动实现序列化,不用显示进行实现了。
3当一个实例对象引用其他对象,当序列化该对象时也把引用的对象进行了实例化。
个人总结:serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。
二、为一个实现Serializable接口的父类,编写一个能够序列化的子类 子类将自动的实现序列化 (序列化遇到继承)
为一个没有实现Serializable接口的父类,编写一个能够序列化的子类 1, 父类要有一个无参的constructor;2, 子类要先序列化自身,然后子类要负责序列化父类的域
父类实现了Serializable,子类不需要实现Serializable
相关注意事项
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
d)并非所有的对象都可以序列化,至于为什么不可以,有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现。
例子:
1,父类实现了Serializable,子类没有,
父类有int a = 1int b = 2int c = 3
子类有int d = 4int e = 5
序列化子类的时候,d和e会不会被序列化?(答案:会)
2,反过来父类未实现Serializable,子类实现了,序列化子类实例的时候,父类的属性是直接被跳过不保存,还是能保存但不能还原?(答案:值不保存)
解:父类实现接口后,所有派生类的属性都会被序列化。子类实现接口的话,父类的属性值丢失。
java中序列化之子类继承父类序列化
当一个父类实现Serializable接口后,他的子类都将自动的实现序列化。
参考博客:http://www.yesky.com/376/1908876.shtml
https://blog.csdn.net/liuxiao723846/article/details/52005532