JAVA 序列化、反序列化以及 serialVersionUID
public void setAge(Integer age) {
this.age = age;
}
}
可以看到上面的类 Dog 实现了 Serializable, 标记这个类是可以序列化的。
有人也注意到了,为什么没有弄 serialVersionUID ??
其实咱们如果不手动设置 serialVersionUID,会有默认计算出的 serialVersionUID 的。后面再讨论为什么有手动弄 serialVersionUID 的场景。
结合代码
序列化
import com.jc.mytest.model.Dog;
import java.io.*;
/**
@Author : JCccc
@CreateTime : 2020/4/21
《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 @Description :
**/
public class SerializeTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化对象-IO 流-存储
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\dogInfoText.out"));
Dog dog=new Dog();
dog.setName("阿福");
dog.setAge(1);
objectOutputStream.writeObject(dog);
objectOutputStream.flush();
objectOutputStream.close();
}
}
运行一下,可以看到我们的 D 盘生成了这个 Dog 类型序列化后的文件,
里面全是 ‘乱码’,没事乱码我们看不懂,但是 jvm 能看懂。
反序列化
public class SerializeTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\dogInfoText.out"));
Dog dog = (Dog) objectInputStream.readObject();
System.out.println("dog's name:"+dog.getName());
}
}
运行结果,跟我们序列化进去的 Dog 设置的字段属性值一样:
序列化和反序列化的简单使用操作已经完毕,作用显然都知道了,简单的理解就是转存为字节流可以方便传输,然后反序列化可以快速地拿到原来的对象。
那么接下来我们来看看为什么要加?serialVersionUID ? 如:
private static final long serialVersionUID = -856737404570574682 Java 开源项目【ali1024.coding.net/public/P7/Java/git】 7L;
private static final long serialVersionUID = 1L;
上面有说过如果我们不手动加这个?serialVersionUID,是会默认生成一个的,只是我们看不到。
上面也有说过,这个 serialVersionUID 就像是这个类的身份证号码一样,具有唯一识别的性质。
举例:
原本我们的 Dog 类只有 2 个字段属性,
最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料 &最新 2021 收集的一些大厂的面试真题(都整理成文档,小部分截图)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
评论