第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使自定義.NET Exception可序列化的正確方法是什么?

使自定義.NET Exception可序列化的正確方法是什么?

三國紛爭 2019-10-23 14:23:31
更具體地說,當(dāng)異常包含自定義對象時,自定義對象本身可以序列化也可以不序列化。舉個例子: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; }    }}如果將此Exception序列化和反序列化,則將不保留兩個自定義屬性(ResourceName和ValidationErrors)。屬性將返回null。是否存在用于實現(xiàn)自定義異常的序列化的通用代碼模式?
查看完整描述

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>));

    }


}


查看完整回答
反對 回復(fù) 2019-10-23
?
BIG陽

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ù)等。


對于我來說,這仍然是非常容易并且可以理解的。


查看完整回答
反對 回復(fù) 2019-10-23
  • 3 回答
  • 0 關(guān)注
  • 671 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號