为啥我们在扩展 RuntimeException 时需要 serialVersionUID?

Posted

技术标签:

【中文标题】为啥我们在扩展 RuntimeException 时需要 serialVersionUID?【英文标题】: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);
    

【问题讨论】:

***.com/questions/3429921/what-does-serializable-mean 您是否考虑过咨询Javadoc? 【参考方案1】:

RuntimeException 扩展 ExceptionException 扩展 ThrowableThrowable 实现 Serializable。所以DataNotFoundException 也是Serializable

【讨论】:

【参考方案2】:

是的,Throwables 是可序列化的。可序列化意味着该类的对象可以转换为字节序列。使异常可序列化意味着它可以通过网络在分布式应用程序的层之间传输。

【讨论】:

【参考方案3】:

异常类或任何实现Serializable的类都需要有SerialUID,这样在编译时已经序列化的类,在重新编译时de-serializedJVM就可以了与哪个序列化类的版本匹配的版本 de-serialized.Serialisation 的实现原因如下。

    通过以下方式支持在不同虚拟机中运行的类的不同版本之间的双向通信: 定义一种机制,允许JavaTM 类读取由同一类的旧版本写入的流。 定义一种机制,允许JavaTM 类写入旨在由同一类的旧版本读取的流。 为持久性和RMI 提供默认序列化。 在简单的情况下表现良好并产生紧凑的流,以便RMI 可以使用序列化。 能够识别和加载与用于写入流的确切类匹配的类。 保持非版本化类的开销较低。 使用允许遍历流的流格式,而无需调用特定于保存在流中的对象的方法。

【讨论】:

以上是关于为啥我们在扩展 RuntimeException 时需要 serialVersionUID?的主要内容,如果未能解决你的问题,请参考以下文章

JVM 如何处理 RuntimeException(s)

为啥我在使用 RemoteFileTemplate 时会在日志中收到意外的 RuntimeException 警告?

为啥会发生此错误? java.lang.RuntimeException:ImageLoader 必须在使用前通过配置初始化

为啥运行时异常是未经检查的异常?

为啥捕获 RuntimeException 不被认为是一种好的编程习惯? [关闭]

java.lang.RuntimeException:无法识别的 XSLTC 扩展“http://saxon.sf.net/:assign”