CA2236: Chamar métodos da classe base nos tipos de ISerializable
TypeName |
CallBaseClassMethodsOnISerializableTypes |
CheckId |
CA2236 |
<strong>Categoria</strong> |
Microsoft.Usage |
Alteração significativa |
Não separável |
Causa
Um tipo deriva de um tipo que implementa o System.Runtime.Serialization.ISerializable interface e uma das seguintes condições for verdadeira:
O tipo implementa o construtor de serialização, isto é, um construtor com o System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext parâmetro assinatura, mas não não chamar o construtor de serialização do tipo base.
O tipo implementa o ISerializable.GetObjectData método mas não chama o GetObjectData o método do tipo base.
Descrição da regra
Em um processo de serialização personalizada, um tipo implementa o GetObjectData método para serializar seus campos e o construtor de serialização para desserializar os campos. Se o tipo deriva de um tipo que implementa o ISerializable de interface tipo base GetObjectData Construtor de serialização e o método deve ser chamado para serializar/de-serialize os campos do tipo base. Caso contrário, o tipo de não ser serializado e ser desserializado corretamente. Observe que, se o tipo derivado não adicionar quaisquer novos campos, o tipo não precisa implementar a GetObjectData método nem o construtor de serialização ou ligue para o tipo base equivalentes.
Como corrigir violações
Para corrigir uma violação desta regra, ligue para o tipo base GetObjectData Construtor de método ou a serialização do correspondente derivado de tipo de método ou construtor.
Quando suprimir avisos
Não suprimir um aviso da regra.
Exemplo
O exemplo a seguir mostra um tipo derivado que satisfaça a regra, chamando o construtor de serialização e GetObjectData o método da classe de 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);
}
}
}
Regras relacionadas
CA2240: Implementa ISerializable corretamente
CA2229: Implementar os construtores de serialização
CA2238: Implementar métodos de serialização corretamente
CA2235: Marcar todos os campos não serializáveis
CA2237: Tipos de ISerializable de marca com o SerializableAttribute
CA2239: Fornecer métodos de desserialização de campos opcionais