java序列化着实令人困惑。找了一些博客看发现好多内容都一样。诶,但是让我找到了一篇讲的比较明白的文章。https://blog.csdn.net/qq_32575047/article/details/80070590
嗯,还是得让自己写一写,不然我过不了多久就会忘。
什么是序列化?我的理解,就是将对象写入文件,该文件在你以文本形式阅读是无意义的(因为看不明白,一大堆奇怪的符号),并且Java虚拟机是可以将文件中的对象还原的,恢复至当时的状态。就如同游戏人物中的道具,等级,经验等东西,如果在关闭游戏后这些东西都没了,得从头开始。说实话劝退大多数人。但是,重新打开游戏后,对象的状态可以恢复,道具,等级,经验都会回复到原来的状态,就挺人性化的。
代码:
import java.io.*;
//引入实现io的库
public class demo5 implements Serializable{
private int width;
private int height;
public void setWidth(int w){
width=w;
}
public void setHeight(int h){
height=h;
}
public static void main(String [] args){
demo5 demo =new demo5();
demo.setWidth(20);
demo.setHeight(50);
//当对象被实例化时,该对象引用的实例对象也会被实例化。且所有被引用的对象也会被实例化。操作实现时自动进行的。
try{
FileOutputStream fs=new FileOutputStream("foo.ser");
//将文件写入规定的文件夹,如果没有文件夹就会创建一个新的文件夹
ObjectOutputStream os=new ObjectOutputStream(fs);
//将对象转换成可以写入的数据
os.writeObject(demo);
//写入对象
os.close();
//关闭方法,且释放内存
} catch(Exception ex){
ex.printStackTrace();
}
}
结果:
注意的东西:1、首先类要实现Serializable接口
2、transient标注的变量,序列化时会被跳过
3、类序列化被还原之后,由于transient标注的变量在序列化时被跳过了,所以会给个 默认值 null。primitive主数据类型数据的默认值为0、false.
4、当对象被实例化时,该对象引用的实例对象也会被实例化。且所有被引用的对象也会被实例化。
说句实在话,我在看书看博客后,自己写一遍,还是有些东西写不出来。欢迎大家指正,互相交流学习。