You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何要将自定义Exception标记为Serializable(可序列化)?

自定义异常中<Serializable>特性的作用

.NET 中的 Exception 基类本身实现了 ISerializable 接口,天生支持序列化机制。给自定义异常添加 <Serializable> 特性的核心作用是确保你的异常类能被正常序列化与反序列化,这在以下场景中是必需的:


1. 跨边界传递异常

当需要在不同应用域(如 ASP.NET 模块间、WCF 服务调用)或不同进程之间传递异常时,序列化是实现这一操作的基础。如果缺少 <Serializable> 特性,尝试序列化自定义异常时会直接抛出 SerializationException,导致异常无法被正确传递到接收端。

2. 持久化异常信息

若要将异常对象保存到文件、数据库或其他存储介质,后续再恢复查看细节,序列化能力是必备条件。<Serializable> 特性允许 .NET 序列化工具(如 BinaryFormatter、DataContractSerializer)正确处理你的自定义异常类,完整保留异常的所有信息。

3. 兼容.NET异常体系规范

虽然 Exception 基类默认支持序列化,但自定义异常若不添加 <Serializable> 特性,会打破整个异常体系的一致性。尤其是当你的异常类包含自定义属性(比如第二个示例中的 StudentName)时,只有添加该特性,这些自定义属性才能在序列化过程中被正确保存和恢复。


补充说明

如果自定义异常添加了 <Serializable> 特性且包含自定义属性,建议显式实现 ISerializable 接口的 GetObjectData 方法,并添加反序列化构造函数,确保自定义属性不会在序列化过程中丢失。以第二个示例的 StudentNotFoundException 为例,完善后的代码如下:

<Serializable>
Public Class StudentNotFoundException
    Inherits Exception

    Public ReadOnly Property StudentName As String

    Public Sub New()
    End Sub

    Public Sub New(message As String)
        MyBase.New(message)
    End Sub

    Public Sub New(message As String, inner As Exception)
        MyBase.New(message, inner)
    End Sub

    Public Sub New(message As String, studentName As String)
        Me.New(message)
        StudentName = studentName
    End Sub

    ' 反序列化构造函数,必须为Protected/Private,用于反序列化过程
    Protected Sub New(info As SerializationInfo, context As StreamingContext)
        MyBase.New(info, context)
        ' 读取自定义属性
        StudentName = info.GetString("StudentName")
    End Sub

    ' 实现ISerializable的GetObjectData方法,保存自定义属性
    Public Overrides Sub GetObjectData(info As SerializationInfo, context As StreamingContext)
        MyBase.GetObjectData(info, context)
        ' 写入自定义属性
        info.AddValue("StudentName", StudentName)
    End Sub
End Class

若不添加上述代码,自定义属性 StudentName 在序列化后会丢失,反序列化后的异常对象中该属性会是默认值(如空字符串)。

内容的提问来源于stack exchange,提问作者spinjector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:22:26