LCA2236: Llamar a métodos de clase base en tipos ISerializable
Nombre de tipo |
CallBaseClassMethodsOnISerializableTypes |
Identificador de comprobación |
CA2236 |
Categoría |
Microsoft.Usage |
Cambio problemático |
No |
Motivo
Un tipo se deriva de un tipo que implementa la interfaz System.Runtime.Serialization.ISerializable y se cumple una de las condiciones siguientes:
El tipo implementa la serialización del constructor, es decir, un constructor con System.Runtime.Serialization.SerializationInfo, la firma del parámetro System.Runtime.Serialization.StreamingContext, pero no llama al constructor de la serialización del tipo base.
El tipo implementa el método 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 sus campos y el constructor de la serialización para deserializar los campos.Si el tipo deriva de un tipo que implementa la interfaz ISerializable, debería llamarse al método del tipo base GetObjectData y al constructor de la serialización para serializar/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 la serialización ni llamar a los equivalentes del tipo base.
Cómo corregir infracciones
Para corregir una infracción de esta regla, llame al método del tipo base GetObjectData o al constructor de serialización desde el constructor o el método del tipo derivado correspondiente.
Cuándo suprimir advertencias
No suprima las advertencias de esta regla.
Ejemplo
El ejemplo siguiente muestra un tipo derivado que cumple la regla llamando al constructor de serialización y el método GetObjectData de la clase 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);
}
}
}
Reglas relacionadas
CA2240: Implementar ISerializable correctamente
CA2229: Implementar constructores de serialización
CA2238: Implementar los métodos de serialización de forma correcta
CA2235: Marcar todos los campos no serializables
CA2237: Marcar los tipos ISerializable con SerializableAttribute
CA2239: Proporcionar métodos de deserialización para campos opcionales