今天在编写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--毛毛
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


