使自定义.NET异常可序列化的正确方法是在.NET类中实现ISerializable
接口,如下所示:
using System.Runtime.Serialization;
public class CustomException : Exception, ISerializable
{
private string message;
public CustomException(string message) : base(message)
{
this.message = message;
}
public CustomException(string message, Exception innerException) : base(message, innerException)
{
this.message = message;
}
protected CustomException(SerializationInfo info, StreamingContext context) : base(info, context)
{
message = info.GetString("Message");
}
public string Message
{
get { return message; }
set { message = value; }
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info == null) throw new ArgumentNullException("info");
info.AddValue("Message", message);
base.GetObjectData(info, context);
}
}
在实现自定义异常时需要确保异常具有描述性,否则在序列化时不推荐自定义异常。另外,自定义异常应该被标记为ISerializable
,以允许程序在序列化或反序列化自定义异常时使用自定义元数据(即objectData
)。
ISerializable
方法:GetObjectData
和GetConstructor
必须被实现。GetObjectData
方法会调用基类的GetObjectData
方法,并传递自定义元数据作为参数,同时GetConstructor
方法会返回一个创建该类型的新实例的构造方法。
领取专属 10元无门槛券
手把手带您无忧上云