CA2229:必須實作序列化建構函式

屬性
規則識別碼 CA2229
標題 必須實作序列化建構函式
類別 使用方式
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 No

注意

此規則在 .NET 8 中已移除,因為它與SYSLIB0051衝突 :舊版序列化支援 API 已過時

原因

類型會實作 System.Runtime.Serialization.ISerializable 介面,不是委派或介面,下列其中一個條件為 true:

  • 此類型沒有接受 SerializationInfo 物件和 StreamingContext 物件的建構函式(序列化建構函式的簽章)。

  • 類型未密封,且其序列化建構函式的存取修飾詞不受保護(系列)。

  • 類型是密封的,而且其序列化建構函式的存取修飾詞不是私用的。

檔案描述

此規則與支援自訂序列化的類型相關。 如果類型實作 ISerializable 介面,則其支援自訂序列化。 序列化建構函式是還原序列化或使用 方法序列化 ISerializable.GetObjectData 或重新建立的物件所需的建構函式。

如何修正違規

若要修正此規則的違規情形,請實作序列化建構函式。 針對密封類別,讓建構函式成為 private,否則為 protected。

隱藏警告的時機

請勿隱藏違反規則的行為。 此類型將無法還原序列化,而且在許多案例中將無法運作。

範例

下列範例顯示符合規則的類型。

[Serializable]
public class SerializationConstructorsRequired : ISerializable
{
    private int n1;

    // This is a regular constructor.
    public SerializationConstructorsRequired()
    {
        n1 = -1;
    }
    // This is the serialization constructor.
    // Satisfies rule: ImplementSerializationConstructors.

    protected SerializationConstructorsRequired(
       SerializationInfo info,
       StreamingContext context)
    {
        n1 = (info.GetValue(nameof(n1), typeof(int)) != null) ?
            (int)info.GetValue(nameof(n1), typeof(int))! :
            -1;
    }

    // The following method serializes the instance.
    void ISerializable.GetObjectData(SerializationInfo info,
       StreamingContext context)
    {
        info.AddValue(nameof(n1), n1);
    }
}

CA2237:ISerializable 類型必須標記 SerializableAttribute

另請參閱