CA2236: Chiamare metodi della classe base su tipi ISerializable
Articolo | Valore |
---|---|
ID regola | CA2236 |
Category | Microsoft.Usage |
Modifica | Nessuna interruzione |
Causa
Un tipo deriva da un tipo che implementa l'interfaccia System.Runtime.Serialization.ISerializable e una delle condizioni seguenti è vera:
Il tipo implementa il costruttore di serializzazione, ovvero un costruttore con la System.Runtime.Serialization.SerializationInfofirma del parametro , System.Runtime.Serialization.StreamingContext ma non chiama il costruttore di serializzazione del tipo di base.
Il tipo implementa il System.Runtime.Serialization.ISerializable.GetObjectData metodo ma non chiama il GetObjectData metodo del tipo di base.
Descrizione regola
In un processo di serializzazione personalizzato, un tipo implementa il GetObjectData metodo per serializzare i relativi campi e il costruttore di serializzazione per de-serializzare i campi. Se il tipo deriva da un tipo che implementa l'interfaccia ISerializable , il metodo del tipo GetObjectData di base e il costruttore di serializzazione devono essere chiamati per serializzare/de-serializzare i campi del tipo di base. In caso contrario, il tipo non verrà serializzato e de serializzato correttamente. Si noti che se il tipo derivato non aggiunge nuovi campi, il tipo non deve implementare il GetObjectData metodo né il costruttore di serializzazione o chiamare gli equivalenti del tipo di base.
Come correggere le violazioni
Per correggere una violazione di questa regola, chiamare il metodo del tipo GetObjectData di base o il costruttore di serializzazione dal metodo o dal costruttore di tipo derivato corrispondente.
Quando eliminare gli avvisi
Non escludere un avviso da questa regola.
Esempio
Nell'esempio seguente viene illustrato un tipo derivato che soddisfa la regola chiamando il costruttore di serializzazione e GetObjectData il metodo della classe base.
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: Specificare metodi di deserializzazione per i campi facoltativi
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per