CA2236: Llamar a métodos de clase base en tipos ISerializable
Elemento | Valor |
---|---|
RuleId | CA2236 |
Category | Microsoft.Usage |
Cambio importante | Poco problemático |
Causa
Un tipo deriva de un tipo que implementa la interfaz System.Runtime.Serialization.ISerializable y se cumple una de las condiciones siguientes:
El tipo implementa el constructor de serialización, es decir, un constructor con System.Runtime.Serialization.SerializationInfo, firma de parámetro System.Runtime.Serialization.StreamingContext, pero no llama al constructor de serialización del tipo base.
El tipo implementa el método System.Runtime.Serialization.ISerializable.GetObjectData pero no llama al método GetObjectData del tipo base.
Descripción de la regla
En un proceso de serialización personalizado, un tipo implementa el método GetObjectData para serializar los campos y el constructor de serialización para des serializar los campos. Si el tipo deriva de un tipo que implementa la interfaz ISerializable, se debe llamar al método GetObjectData de tipo base y al constructor de serialización para serializar o deserializar los campos del tipo base. De lo contrario, el tipo no se serializará ni se deserializará correctamente. Tenga en cuenta que si el tipo derivado no agrega ningún campo nuevo, el tipo no necesita implementar el método GetObjectData ni el constructor de serialización ni tampoco llamar a los equivalentes de tipo base.
Cómo corregir infracciones
Para corregir una infracción de esta regla, llame al método de tipo base GetObjectData o al constructor de serialización desde el constructor o el método de tipo derivado correspondiente.
Cuándo suprimir las advertencias
No suprima las advertencias de esta regla.
Ejemplo
En el ejemplo siguiente se muestra un tipo derivado que satisface la regla llamando al constructor de serialización y al método GetObjectData de la clase 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);
}
}
}
Reglas relacionadas
CA2240: Implementar ISerializable correctamente
CA2229: Implementar constructores de serialización
CA2238: Implementar métodos de serialización correctamente
CA2235: Marcar todos los campos no serializables
CA2237: Marcar los tipos ISerializable con SerializableAttribute
CA2239: Proporcionar métodos de deserialización para campos opcionales
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de