为啥我的异常类需要序列化?

Posted

技术标签:

【中文标题】为啥我的异常类需要序列化?【英文标题】:Why my exception class needs to be serialized?为什么我的异常类需要序列化? 【发布时间】:2011-12-02 18:44:37 【问题描述】:

当您使用 Exception 类扩展一个类(用于创建新异常)时,您会收到一条警告,提示您有 serialVersionUID。我知道serialVersionUID在序列化和反序列化时起着重要作用,但是我的Exception什么时候需要序列化呢?谁能给我一个我希望我的自定义异常类具有序列化和反序列化的实际案例?

【问题讨论】:

【参考方案1】:

这是因为所有异常的根类Throwable 实现了Serializable 接口。默认情况下,所有异常都是可序列化的,这是一种语言设计决定,因为作者希望能够在没有任何特殊配置的情况下通过网络发送异常。

如果基类不可序列化,那么在远程方法失败的情况下,您将很难准确地传达到底出了什么问题,因为您无法控制内置的异常类型。

【讨论】:

【参考方案2】:

如果您的自定义异常曾经在分布式应用程序中使用过(使用 RMI、Spring http-invoker 等)并且可以从远程客户端调用的服务器方法中抛出,那么必须将异常序列化为穿过电线去客户端。

【讨论】:

【参考方案3】:

您唯一的选择是为您定义的每个 Exception 类型定义 serialVersionUID(IDE 可以为您生成它)或抑制警告。

您可能会发现我之前的问题explicit serialVersionUID considered harmful? 相关。

【讨论】:

以上是关于为啥我的异常类需要序列化?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 hadoop map reduce 程序中出现类转换异常?

如果我参考基类捕获它,为啥我的异常会被切分到基类?

为啥我的代码停止并且不返回异常?

为啥我的 Java 程序在捕获到异常后退出?

为啥需要自定义异常类[重复]

为啥我的 collectionViewCell 显示异常行为?