Sdílet prostřednictvím


Serialisierungskonstruktoren implementieren

Aktualisiert: November 2007

     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 betrifft Typen, die die benutzerdefinierte Serialisierung unterstützen. Ein Typ unterstützt die benutzerdefinierte Serialisierung, wenn er die ISerializable-Schnittstelle implementiert. Der Serialisierungskonstruktor wird benötigt, um Objekte zu deserialisieren oder neu zu erstellen, die mit der ISerializable.GetObjectData-Methode serialisiert wurden.

Behandlung 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

Markieren von ISerializable-Typen mit SerializableAttribute

Siehe auch

Referenz

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext