3 回答

TA貢獻(xiàn)1811條經(jīng)驗 獲得超4個贊
異常已經(jīng)可以序列化,但是您需要重寫該GetObjectData方法來存儲變量并提供一個構(gòu)造函數(shù),該構(gòu)造函數(shù)可在重新為對象補水時調(diào)用。
因此,您的示例變?yōu)椋?/p>
[Serializable]
public class MyException : Exception
{
private readonly string resourceName;
private readonly IList<string> validationErrors;
public MyException(string resourceName, IList<string> validationErrors)
{
this.resourceName = resourceName;
this.validationErrors = validationErrors;
}
public string ResourceName
{
get { return this.resourceName; }
}
public IList<string> ValidationErrors
{
get { return this.validationErrors; }
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter=true)]
protected MyException(SerializationInfo info, StreamingContext context) : base (info, context)
{
this.resourceName = info.GetString("MyException.ResourceName");
this.validationErrors = info.GetValue("MyException.ValidationErrors", typeof(IList<string>));
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter=true)]
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
info.AddValue("MyException.ResourceName", this.ResourceName);
// Note: if "List<T>" isn't serializable you may need to work out another
// method of adding your list, this is just for show...
info.AddValue("MyException.ValidationErrors", this.ValidationErrors, typeof(IList<string>));
}
}

TA貢獻(xiàn)1859條經(jīng)驗 獲得超6個贊
為了補充上面的正確答案,我發(fā)現(xiàn)如果將自定義屬性存儲在類的Data集合中,則可以避免執(zhí)行此自定義序列化工作Exception。
例如:
[Serializable]
public class JsonReadException : Exception
{
// ...
public string JsonFilePath
{
get { return Data[@"_jsonFilePath"] as string; }
private set { Data[@"_jsonFilePath"] = value; }
}
public string Json
{
get { return Data[@"_json"] as string; }
private set { Data[@"_json"] = value; }
}
// ...
}
就性能而言,這可能比Daniel提供的解決方案效率低,并且可能僅適用于“整數(shù)”類型,例如字符串和整數(shù)等。
對于我來說,這仍然是非常容易并且可以理解的。
- 3 回答
- 0 關(guān)注
- 671 瀏覽
添加回答
舉報