Freigeben über


CA2229: Serialisierungskonstruktoren implementieren

TypeName

ImplementSerializationConstructors

CheckId

CA2229

Kategorie

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Der Typ implementiert die System.Runtime.Serialization.ISerializable-Schnittstelle, ist kein Delegat bzw. keine Schnittstelle, und eine der folgenden Bedingungen ist erfüllt:

  • Der Typ verfügt über keinen Konstruktor, der ein System.Runtime.Serialization.SerializationInfo-Objekt und ein System.Runtime.Serialization.StreamingContext-Objekt (die Signatur des Serialisierungskonstruktors) annimmt.

  • Der Typ ist unversiegelt, und der Zugriffsmodifizierer für seinen Serialisierungskonstruktor ist nicht geschützt (Familie).

  • Der Typ ist versiegelt, und der Zugriffsmodifizierer für seinen Serialisierungskonstruktor ist nicht privat.

Regelbeschreibung

Diese Regel ist relevant für Typen, die die benutzerdefinierte Serialisierung unterstützen. Ein Typ unterstützt benutzerdefinierte Serialisierung, wenn durch ihn die ISerializable-Schnittstelle implementiert wird. Der Serialisierungskonstruktor wird benötigt, um Objekte zu deserialisieren oder neu zu erstellen, die mit der ISerializable.GetObjectData-Methode serialisiert wurden.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie den Serialisierungskonstruktor. Definieren Sie den Konstruktor bei einer versiegelten Klasse als privaten Konstruktor. Definieren Sie ihn andernfalls als geschützten Konstruktor.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keinen Verstoß gegen diese Regel. Der Typ ist dann nämlich nicht deserialisierbar und funktioniert in vielen Szenarien nicht.

Beispiel

Im folgenden Beispiel wird ein Typ veranschaulicht, der der Regel entspricht.

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

Verwandte Regeln

CA2237: Markieren von ISerializable-Typen mit SerializableAttribute

Siehe auch

Referenz

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext