【问题标题】:Why do we need serialVersionUID when extending RuntimeException?为什么我们在扩展 RuntimeException 时需要 serialVersionUID?
【发布时间】:2018-03-17 20:42:49
【问题描述】:
为什么我们在扩展 RuntimeException 时需要 serialVersionUID? RuntimeException 是可序列化的类吗?
public class DataNotFoundException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 1;
public DataNotFoundException(String str)
{
super(str);
}
}
【问题讨论】:
标签:
java
serialization
runtimeexception
serialversionuid
【解决方案1】:
RuntimeException 扩展 Exception。 Exception 扩展 Throwable。 Throwable 实现 Serializable。所以DataNotFoundException 也是Serializable
【解决方案2】:
是的,Throwables 是可序列化的。可序列化意味着该类的对象可以转换为字节序列。使异常可序列化意味着它可以通过网络在分布式应用程序的层之间传输。
【解决方案3】:
异常类或任何实现Serializable的类都需要有SerialUID,这样在编译时已经序列化的类,在重新编译时de-serialized,JVM就可以了与哪个序列化类的版本匹配的版本 de-serialized.
Serialisation 的实现原因如下。
- 通过以下方式支持在不同虚拟机中运行的类的不同版本之间的双向通信:
- 定义一种机制,允许
JavaTM 类读取由同一类的旧版本写入的流。
- 定义一种机制,允许
JavaTM 类写入旨在由同一类的旧版本读取的流。
- 为持久性和
RMI 提供默认序列化。
- 在简单的情况下表现良好并产生紧凑的流,以便
RMI 可以使用序列化。
- 能够识别和加载与用于写入流的确切类匹配的类。
- 保持非版本化类的开销较低。
使用允许遍历流的流格式,而无需调用特定于保存在流中的对象的方法。