JAVA Serializable 类中的Serial Version ID

在JAVA中,当需要把一个类序列化的时候,显示提供一个serialVersionUID有什么用呢?

 

a)小幅性能提升,免除JVM运行时对这个值的计算。

 

b)避免java.io.InvalidClassException,不同的JVM对serialVersionUID的计算方法可能不一样,就算类的定义和序列化后的对象是一致的,也可能从JVM-A里序列化后的对象到达JVM-B后,JVM-B认为 Class Invalid。

还有,对象在序列化后,Class定义被改变了,如果明确提供了serialVersionUID,只有serialVersionUID不变,对象仍然能被正常的deserialize。【不过,best practise最好不要这么做】

 

### 解决方案 为了消除 `Serializable` 中缺少 `serialVersionUID` 的警告,在 IntelliJ IDEA 中可以按照以下方式为添加 `serialVersionUID` 字段。 #### 添加 serialVersionUID 字段 对于实现了 `Serializable` 接口的 Java ,建议显式声明一个名为 `serialVersionUID` 的静态常量字段。这有助于确保序列化的兼容性和稳定性。可以在定义中加入如下代码: ```java private static final long serialVersionUID = 1L; ``` 具体应用到提供的例子中,修改后的 `SerializeTest` 应如下所示[^2]: ```java package com.sogou.study.serialize; import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class SerializeTest implements Serializable { private static final long serialVersionUID = 1L; // 显式声明 serialVersion UID public static void main(String[] args) throws Exception { Client client = new Client(); client.setId(11); client.setName("client"); ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("D:\\test\\file1.txt")); oo.writeObject(client); oo.close(); } } ``` 同样地,对于 `Client` 也需要做相应的处理: ```java class Client implements Serializable { private static final long serialVersionUID = 1L; // 显式声明 serialVersion UID private int id; private String name; // getter 和 setter 方法... public void setId(int id){ this.id = id; } public void setName(String name){ this.name = name; } } ``` 完成上述更改后,记得保存所有文件并重启 IntelliJ IDEA 以便使新的配置生效[^1]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值