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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

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

3 回答

?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊

異常已經(jīng)可以序列化,但是您需要重寫該GetObjectData方法來存儲(chǔ)變量并提供一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)可在重新為對(duì)象補(bǔ)水時(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>));

    }


}


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

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

為了補(bǔ)充上面的正確答案,我發(fā)現(xiàn)如果將自定義屬性存儲(chǔ)在類的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ù)等。


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


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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