簡體   English   中英

具有可選參數的構造函數上的SerializableAttribute

[英]SerializableAttribute on a constructor with optional parameters

當構造函數有參數但每個參數都有默認值時,是否存在技術原因導致對象的序列化不起作用?

例如,假設這是我想要序列化的(偽)類:

[SerializableAttribute]
public class Parameter
{
    public Parameter(int p1 = -1, int p2 = -1, int p3 = -1, AnotherEnum p4 = AnotherEnum.Enum1)
    {
        P1 = p1;
        P2 = p2;
        P3 = p3;
        m_enum = p4;
    }

    private AnotherEnum m_enum;

    [DataMember(Name = "P1")]
    public int P1 { get; set; }


    [DataMember(Name = "P2")]
    public int P2 { get; set; }


    [DataMember(Name = "P3")]
    public int P3 { get; set; }

    [DataMember(Name = "P4")]
    public AnotherEnum Enum
    {
        get
        {
            return m_enum;
        }
        set
        {
            m_enum = value;
        }
    }
}

這會給我一個例外:

Namespace.Parameter無法序列化,因為它沒有無參數構造函數。

一種解決方法是這樣的:

public Parameter() // or this(-1)
{
    P1 = -1;
    P2 = -1;
    P3 = -1;
    m_enum = AnotherEnum.Enum1;
}

public Parameter(int p1 /* remove default value */, int p2 = -1, int p3 = -1, AnotherEnum p4 = AnotherEnum.Enum1)
{
    P1 = p1;
    P2 = p2;
    P3 = p3;
    m_enum = p4;
}

我想知道,為什么XMLSerializer沒有看到帶有參數的構造函數都具有默認值。 那有更好的解決方法嗎?

提前致謝!

我們必須轉到編譯器級別才能理解帶有可選參數的方法實際上是使用非可選參數對方法進行編譯時替換

換句話說, 沒有真正的“帶有默認值的可選參數” 它是一個“在編譯時替換的非可選參數”,在設計時使用了 C#4.0以來稱為“帶有默認參數的可選參數”的合成糖

“具有默認值的可選參數”僅是設計時的概念,而不是編譯/運行時的概念。

為了說明,假設你有:

public Parameter(int p1 = -1, int p2 = -1, int p3 = -1, AnotherEnum p4 = AnotherEnum.Enum1)
{
    P1 = p1;
    P2 = p2;
    P3 = p3;
    m_enum = p4;
}

你也是:

Parameter pa = new Parameter(1);
Parameter pb = new Parameter(1, -1);

它們中的兩個將產生相同的中間語言(IL),盡管在設計時它們看起來不同(!)。

附加說明:至於為什么XMLSerializer需要無參數構造函數。 這里有很好的解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM