吕梁建站公司,自己设计app,自助网站模板平台,定制类做网站多少钱序列化是将对象的状态信息转换为可存储或传输的形式的过程。我们都知道#xff0c;Java 对象是保持在 JVM 的堆内存中的#xff0c;也就是说#xff0c;如果 JVM 堆不存在了#xff0c;那么对象也就跟着消失了。 而序列化提供了一种方案#xff0c;可以让你在即使 JVM 停机…序列化是将对象的状态信息转换为可存储或传输的形式的过程。我们都知道Java 对象是保持在 JVM 的堆内存中的也就是说如果 JVM 堆不存在了那么对象也就跟着消失了。 而序列化提供了一种方案可以让你在即使 JVM 停机的情况下也能把对象保存下来的方案。就像我们平时用的 U盘一样。 把 Java 对象序列化成可存储或传输的形式如二进制流比如保存在文件中。这样当再次需要这个对象的时候从文件中读取出二进制流再从二进制流中反序列化出对象。 但是虚拟机是否允许反序列化不仅取决于类路径和功能代码是否一致一个非常重要的一点是两个类的序列化 ID 是否一致即 serialVersionUID要求一致。 在进行反序列化时JVM 会把传来的字节流中的 serialVersionUID与本地相应实体类的 serialVersionUID 进行比较如果相同就认为是一致的可以进行反序列化否则就会出现序列化版本不一致的异常即是 InvalidCastException。这样做是为了保证安全因为文件存储中的内容可能被篡改。 当实现 java.io.Serializable接口的类没有显式地定义一个 serialVersionUID变量的时候Java 序列化机制会根据编译的 Class 自动生成一个 serialVersionUID作序列化版本比较用这种情况下如果 Class 文件没有变化就算再编译多次serialVersionUID也不会变化的。但是如果发生了变化那么这个文件对应的 serialVersionUID也就会发生变化。 基于以上原理如果我们一个类实现了Serializable接口但是没有定义serialVersionUID然后序列化。在序列化之后由于某些原因我们对该类做了变更重新启动应用后我们相对之前序列化过的对象进行反序列化的话就会报错。