今天在编写Servlet程序时,系统竟然提示警告
如:网络传输或本地存储,当类涉及在传输(分布式)或缓存(持久化),此时需要序列化,然后才能进行相关操作
JAVA序列化的机制:
使用判断类的serialVersionUID来验证的版本一致的
当两者的serialVersionUID相同时,则说明版本一致,可进行反序列化, 否则会由于版本不一致而导致反序列化异常的现象,输出相应的异常信息(InvalidCastException)
但是此时如果我们没有定义serialVersionUID
此时Eclipse会自动给出相应的提醒
JAVA序列化机制会根据Class自动生成一个serialVersionUID作序列化版本比较用,
但是这种情况下,serialVersionUID不会变化
The serializable class ServletHelloWorld does not declare a static final serialVersionUID field of type long它的警告信息就是告诉我们必须在类中定义相关的ID信息,那么这个serialVersionUID的作用是什么呢?
serialVersionUID用于Java序列化
序列化主要用于类可持久化,如:网络传输或本地存储,当类涉及在传输(分布式)或缓存(持久化),此时需要序列化,然后才能进行相关操作
JAVA序列化的机制:
使用判断类的serialVersionUID来验证的版本一致的
当两者的serialVersionUID相同时,则说明版本一致,可进行反序列化, 否则会由于版本不一致而导致反序列化异常的现象,输出相应的异常信息(InvalidCastException)
serialVersionUID原理分析
- 序列化:序列化操作时会将serialVersionUID写入到序列化文件
- 反序列化:反序列化时系统自动检测文件中的serialVersionUID,检测同当前类的 serialVersionUID是否相同,
相同说明版本一致,则进行反序列化,否则报异常,反序列化失败
serialVersionUID生成方式
- 生成方式1:
直接定义一个serialVersionUID值
private static final long serialVersionUID = xxxxL; - 生成方式2:
通过一些方法计算出,如:根据包名,类名,继承关系,私有方法,属性及参数信息计算出一个serialVersionUID值
serialVersionUID 何种情况会提示信息
当一个类实现类Serializable接口,但是此时如果我们没有定义serialVersionUID
此时Eclipse会自动给出相应的提醒
serialVersionUID 注意事项
当我们实现java.io.Serializable接口时,未显式定义serialVersionUID变量时,JAVA序列化机制会根据Class自动生成一个serialVersionUID作序列化版本比较用,
但是这种情况下,serialVersionUID不会变化
serialVersionUID 应用示例说明
package com.java265.entity.serializable; import java.io.Serializable; public class Persion implements Serializable { private static final long serialVersionUID = 20210811111L; public Long id; public String name; public final String userName; public Persion(Long id, String name){ this.id = id; this.name = name; userName = "java265"; } public String toString() { return id.toString() + "--" + name.toString(); } } /*序列化操作*/ package com.java265.entity.serializable; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class SerialTest { public static void main(String[] args) { Persion p = new Persion(1L, "毛毛"); System.out.println("person Seria:" + p); try { FileOutputStream fos = new FileOutputStream("Persion.txt"); ObjectOutputStream t = new ObjectOutputStream(fos); t.writeObject(p); t.flush(); t.close(); } catch (IOException e) { e.printStackTrace(); } } } /*反序列化功能*/ package com.example.demo.entity.serializable; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectInputStream; public class DeserialTest { public static void main(String[] args) { Persion p; try { FileInputStream fis = new FileInputStream("Persion.txt"); ObjectInputStream t2 = new ObjectInputStream(fis); p = (Persion) t2.readObject(); t2.close(); System.out.println(p.toString()); System.out.println(p.userName); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
运行结果分析: 1.当Persion类序列化为Persion.txt之后 我们此时修改 Persion类 中的serialVersionUID, 然后反序列化,此时由于serialVersionUID不一致,会出现以下错误信息 java.io.InvalidClassException: com.java265.entity.serializable.Persion; local class incompatible: stream classdesc serialVersionUID = 20210811111, local class serialVersionUID = 2222 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1843) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2000) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) at com.java265.entity.serializable.DeserialTest.main(DeserialTest.java:26) 2.当serialVersionUID相同时,则会输出相应结果信息 Person DeserialPerson:1--毛毛
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。