CA2236: Basisklassenmethoden auf ISerializable-Typen aufrufen
TypeName |
CallBaseClassMethodsOnISerializableTypes |
CheckId |
CA2236 |
Kategorie (Category) |
Microsoft.Usage |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein Typ wird von einem Typ abgeleitet, der die ISerializable-Schnittstelle implementiert, und eine der folgenden Bedingungen ist erfüllt:
Der Typ implementiert den Serialisierungskonstruktor, d. h. einen Konstruktor mit der SerializationInfo, StreamingContext-Parametersignatur, ruft jedoch nicht den Serialisierungskonstruktor des Basistyps auf.
Der Typ implementiert die ISerializable.GetObjectData-Methode, ruft jedoch die GetObjectData-Methode des Basistyps nicht auf.
Regelbeschreibung
In einem benutzerdefinierten Serialisierungsprozess implementiert ein Typ die GetObjectData-Methode, um seine Felder zu serialisieren, sowie den Serialisierungskonstruktor, um die Felder zu deserialisieren.Wenn der Typ von einem Typ abgeleitet wird, der die ISerializable-Schnittstelle implementiert, sollten die GetObjectData-Methode und der Serialisierungskonstruktor des Basistyps aufgerufen werden, um die Felder des Basistyps zu serialisieren/deserialisieren.Andernfalls wird der Typ nicht ordnungsgemäß serialisiert und deserialisiert.Wenn der abgeleitete Typ keine neuen Felder hinzufügt, muss der Typ weder die GetObjectData-Methode noch den Serialisierungskonstruktor implementieren und auch keine Entsprechungen des Basistyps aufrufen.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, rufen Sie die GetObjectData-Methode oder den Serialisierungskonstruktor des Basistyps in der Methode oder dem Konstruktor des entsprechenden abgeleiteten Typs auf.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Beispiel
Das folgende Beispiel zeigt einen abgeleiteten Typ, der der Regel entspricht, da der Serialisierungskonstruktor und die GetObjectData-Methode der Basisklasse aufgerufen werden.
Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions
Namespace UsageLibrary
<SerializableAttribute> _
Public Class BaseType
Implements ISerializable
Dim baseValue As Integer
Sub New()
baseValue = 3
End Sub
Protected Sub New( _
info As SerializationInfo, context As StreamingContext)
baseValue = info.GetInt32("baseValue")
End Sub
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overridable Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext) _
Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
<SerializableAttribute> _
Public Class DerivedType: Inherits BaseType
Dim derivedValue As Integer
Sub New()
derivedValue = 4
End Sub
Protected Sub New( _
info As SerializationInfo, context As StreamingContext)
MyBase.New(info, context)
derivedValue = info.GetInt32("derivedValue")
End Sub
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overrides Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext)
info.AddValue("derivedValue", derivedValue)
MyBase.GetObjectData(info, context)
End Sub
End Class
End Namespace
using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
namespace UsageLibrary
{
[SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}
[SerializableAttribute]
public class DerivedType : BaseType
{
int derivedValue;
public DerivedType()
{
derivedValue = 4;
}
protected DerivedType(
SerializationInfo info, StreamingContext context) :
base(info, context)
{
derivedValue = info.GetInt32("derivedValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public override void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("derivedValue", derivedValue);
base.GetObjectData(info, context);
}
}
}
Verwandte Regeln
CA2240: ISerializable ordnungsgemäß implementieren
CA2229: Serialisierungskonstruktoren implementieren
CA2238: Serialisierungsmethoden korrekt implementieren
CA2235: Alle nicht serialisierbaren Felder markieren
CA2237: Markieren von ISerializable-Typen mit SerializableAttribute
CA2239: Deserialisierungsmethoden für optionale Felder angeben