显示声明serialVersionUID可以避免对象不一致
实例1:有serialVersionUID
序列化与反序列实体类
public class Person2 implements Serializable{ /** * */ private static final long serialVersionUID = 1L; /** * */ public Long id; public String name; public final String userName; public String sex; public int age; public Person2(Long id, String name,String sex,int age){ this.id = id; this.name = name; userName = "dddbbb"; this.sex=sex; this.age=age; } public String toString() { return id.toString() + "--" + name.toString(); } }
序列化类:
public class SerialTest { public static void main(String[] args) { Person2 p = new Person2(1L, "陈俊生","male",22); System.out.println("person Seria:" + p); try { FileOutputStream fos = new FileOutputStream("Persion.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(p); oos.flush(); oos.close(); } catch (IOException e) { e.printStackTrace(); } } }
序列化执行完成之后,反序列化执行之前,如果更改了实体类Person后,在执行反序列化代码
public class DeserialTest { public static void main(String[] args) { Person2 p; try { FileInputStream fis = new FileInputStream("Persion.txt"); ObjectInputStream ois = new ObjectInputStream(fis); p = (Person2) ois.readObject(); ois.close(); System.out.println(p.toString()); System.out.println(p.userName); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
结果没有异常
实例化2:无serialVersionUID
public class Person2 implements Serializable{
/**
*
*
/**
*
*/
public Long id;
public String name;
public final String userName;
public String sex;
public int age;
pulic String school;/////序列化之后,反序列化之前新增字段
public Person2(Long id, String name,String sex,int age){
this.id = id;
this.name = name;
userName = "dddbbb";
this.sex=sex;
this.age=age;
}
public String toString() {
return id.toString() + "--" + name.toString();
}
}
序列化类:
public class SerialTest {
public static void main(String[] args) {
Person2 p = new Person2(1L, "陈俊生","male",22);
System.out.println("person Seria:" + p);
try {
FileOutputStream fos = new FileOutputStream("Persion.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.flush();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
序列化执行完成之后,反序列化执行之前,如果更改了实体类Person后(本例中新增字段String school),在执行反序列化代码
public class DeserialTest {
public static void main(String[] args) {
Person2 p;
try {
FileInputStream fis = new FileInputStream("Persion.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
p = (Person2) ois.readObject();
ois.close();
System.out.println(p.toString());
System.out.println(p.userName);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
此时反序列化代码抛出异常:
java.io.InvalidClassException: serial.Person2; local class incompatible: stream classdesc serialVersionUID = 5850213951562638361, local class serialVersionUID = -1986140618597495916
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at serial.DeserialTest.main(DeserialTest.java:13)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?