CA2236: Chiamare metodi della classe base su tipi ISerializable
TypeName |
CallBaseClassMethodsOnISerializableTypes |
CheckId |
CA2236 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Un tipo deriva da un tipo che implementa l'interfaccia ISerializable e si verifica una delle condizioni riportate di seguito:
Il tipo implementa il costruttore di serializzazione, ovvero un costruttore con la firma del parametro SerializationInfo, StreamingContext, ma non chiama il costruttore di serializzazione del tipo di base.
Il tipo implementa il metodo ISerializable.GetObjectData ma non chiama il metodo GetObjectData del tipo di base.
Descrizione della regola
In un processo di serializzazione personalizzato, un tipo implementa il metodo GetObjectData per serializzare i campi relativi e il costruttore di serializzazione per deserializzare i campi.Se il tipo deriva da un tipo che implementa l'interfaccia ISerializable, il costruttore di serializzazione e il metodo GetObjectData del tipo di base devono essere chiamati per serializzare o deserializzare i campi del tipo di base.In caso contrario, il tipo non verrà serializzato e deserializzato correttamente.Si noti che se il tipo derivato non aggiunge alcun nuovo campo, il tipo non deve implementare il metodo GetObjectData né il costruttore di serializzazione oppure chiamare gli equivalenti del tipo di base.
Come correggere le violazioni
Per correggere una violazione di questa regola, chiamare il costruttore di serializzazione o il metodo GetObjectData del tipo di base dal costruttore o dal metodo del tipo derivato corrispondente.
Esclusione di avvisi
Non escludere un avviso da questa regola.
Esempio
Nell'esempio riportato di seguito viene illustrato un tipo derivato che soddisfa la regola chiamando il costruttore di serializzazione e il metodo GetObjectData della classe base.
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);
}
}
}
Regole correlate
CA2240: Implementare ISerializable in modo corretto
CA2229: Implementare costruttori di serializzazione
CA2238: Implementare correttamente i metodi di serializzazione
CA2235: Contrassegnare tutti i campi non serializzabili
CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute
CA2239: Fornire metodi di deserializzazione per i campi facoltativi