Sdílet prostřednictvím


CA2229: Implementovat serializační konstruktory

TypeName

ImplementSerializationConstructors

CheckId

CA2229

Kategorie

Microsoft.Usage

Narušující změna

Nenarušující

Příčina

Typ implementuje rozhraní ISerializable, není delegátem ani rozhraním a je splněna jedna z následujících podmínek:

  • Typ neobsahuje konstruktor, který přebírá objekt SerializationInfo a objekt StreamingContext (podpis konstruktoru serializace).

  • Typ není zapečetěn a modifikátor přístupu pro jeho konstruktor serializace není chráněný (family).

  • Typ je zapečetěn a modifikátor přístupu pro jeho konstruktor serializace není privátní.

Popis pravidla

Toto pravidlo platí pro typy, které podporují vlastní serializaci.Typ podporuje vlastní serializaci, pokud implementuje rozhraní ISerializable.Konstruktor serializace je vyžadován pro rekonstrukci nebo opětovné vytvoření objektů, které byly serializovány pomocí metody ISerializable.GetObjectData.

Jak vyřešit porušení

Implementací konstruktoru serializace se vyřeší porušení tohoto pravidla.Pro zapouzdřené třídy by měl být konstruktor privátní, jinak by měl být chráněný.

Kdy potlačit upozornění

Nepotlačujte porušení tohoto pravidla.Typ nebude možné zrekonstruovat a v mnoha případech nebude pracovat.

Příklad

Následující příklad ukazuje typ, který splňuje toto pravidlo.

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

Související pravidla

CA2237: Označte typy ISerializable pomocí SerializableAttribute

Viz také

Referenční dokumentace

ISerializable

SerializationInfo

StreamingContext