共用方式為


CA2229:請實作序列化建構函式

型別名稱

ImplementSerializationConstructors

CheckId

CA2229

分類

Microsoft.Usage

中斷變更

不中斷

原因

型別實作 ISerializable 介面、不是委派 (Delegate) 或介面,並符合下列其中一個條件:

  • 型別沒有採用 SerializationInfo 物件和 StreamingContext 物件 (序列化 (Serialization) 建構函式的簽章) 的建構函式。

  • 型別為非密封且它的序列化建構函式的存取修飾詞 (Modifier) 不是 protected (Family)。

  • 型別為密封且它的序列化建構函式的存取修飾詞不是 private。

規則描述

此規則會與支援自訂序列化的型別相關。如果型別會實作 ISerializable 介面,就表示會支援自訂序列化。對於使用 ISerializable.GetObjectData 方法序列化的物件,若要還原序列化或重新建立,則需要使用序列化建構函式。

如何修正違規

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

隱藏警告的時機

請勿隱藏此規則的違規。將該型別無法被還原序列化,而且在許多案例中也無法運作。

範例

下列範例會顯示滿足規則的型別。

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;

namespace UsageLibrary 
{   
    [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 = (int) info.GetValue("n1", typeof(int));
        }

        // The following method serializes the instance.
        [SecurityPermission(SecurityAction.LinkDemand, 
            Flags=SecurityPermissionFlag.SerializationFormatter)]
        void ISerializable.GetObjectData(SerializationInfo info, 
           StreamingContext context)
        {
            info.AddValue("n1", n1);
        }
    }
}

相關規則

CA2237:必須以 SerializableAttribute 標記 ISerializable 類型

請參閱

參考

ISerializable

SerializationInfo

StreamingContext