Basisklassenmethoden in ISerializable-Typen aufrufen
Aktualisiert: November 2007
TypeName |
CallBaseClassMethodsOnISerializableTypes |
CheckId |
CA2236 |
Kategorie |
Microsoft.Usage |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein Typ wird von einem Typ abgeleitet, der die System.Runtime.Serialization.ISerializable-Schnittstelle implementiert, und eine der folgenden Bedingungen ist erfüllt:
Der Typ implementiert den Serialisierungskonstruktor, d. h. einen Konstruktor mit der System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.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.
Behandlung 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
ISerializable ordnungsgemäß implementieren
Serialisierungskonstruktoren implementieren
Serialisierungsmethoden korrekt implementieren?
Alle nicht serialisierbaren Felder markieren
Markieren von ISerializable-Typen mit SerializableAttribute