Udostępnij za pośrednictwem


CA2229: Należy zaimplementować konstruktory serializacji

TypeName

ImplementSerializationConstructors

CheckId

CA2229

Kategoria

Microsoft.Usage

Zmiana kluczowa

Niekluczowa

Przyczyna

Typ implementuje interfejs ISerializable, nie jest obiektem delegowanym ani interfejsem, i jeden z następujących warunków jest spełniony:

  • Typ nie ma konstruktora, który przyjmuje obiekt SerializationInfo i obiekt StreamingContext (podpis konstruktora serializacji).

  • Typ jest niezamknięty i modyfikator dostępu do jego konstruktora serializacji nie jest chroniony (rodzina).

  • Typ jest zapieczętowany i modyfikator dostępu do jego konstruktora serializacji nie jest prywatny.

Opis reguły

Ta reguła jest istotna dla typów, które obsługują serializację niestandardową.Typ obsługuje serializację niestandardową jeśli implementuje interfejs ISerializable.Konstruktor serializacji jest wymagany do deserializacji lub ponownego utworzenia obiektów, które były serializowane za pomocą metody ISerializable.GetObjectData.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, należy zaimplementować konstruktor serializacji.Dla zamkniętej klasy, należy ustawić konstruktor prywatnym; w przeciwnym razie powinien być chroniony.

Kiedy pominąć ostrzeżenia

Nie należy pomijać naruszenia tej reguły.Typ nie będzie deserializowalny i nie będzie działać w wielu scenariuszach.

Przykład

Poniższy przykład pokazuje typ, który spełnia regułę.

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

Powiązane reguły

CA2237: Należy oznaczyć typ ISerializable atrybutem SerializableAttribute

Zobacz też

Informacje

ISerializable

SerializationInfo

StreamingContext