CA2236: Chamar métodos da classe base em tipos ISerializable
Item | Valor |
---|---|
RuleId | CA2236 |
Categoria | Microsoft.Usage |
Alteração da falha | Sem interrupção |
Causa
Um tipo deriva de um tipo que implementa a interface System.Runtime.Serialization.ISerializable, e uma das seguintes condições é verdadeira:
O tipo implementa o construtor de serialização, ou seja, um construtor com a assinatura de parâmetro System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext, mas não chama o construtor de serialização do tipo base.
O tipo implementa o método System.Runtime.Serialization.ISerializable.GetObjectData, mas não chama o método GetObjectData do tipo base.
Descrição da regra
Em um processo de serialização personalizado, um tipo implementa o método GetObjectData para serializar seus campos e o construtor de serialização para desserializar os campos. Se o tipo derivar de um tipo que implementa a interface ISerializable, o método GetObjectData do tipo base e o construtor de serialização deverão ser chamados para serializar/desserializar os campos do tipo base. Caso contrário, o tipo não será serializado e desserializado corretamente. Observe que, se o tipo derivado não adicionar novos campos, ele não precisará implementar o método GetObjectData nem o construtor de serialização, nem chamar os equivalentes de tipo base.
Como corrigir violações
Para corrigir uma violação dessa regra, chame o método GetObjectData do tipo base ou o construtor de serialização do método de tipo derivado correspondente ou do construtor.
Quando suprimir avisos
Não suprima um aviso nessa regra.
Exemplo
O exemplo a seguir mostra um tipo derivado que satisfaz a regra chamando o construtor de serialização e o método GetObjectData da 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);
}
}
}
Regras relacionadas
CA2240: Implementar ISerializable corretamente
CA2229: Implementar construtores de serialização
CA2238: Implementar métodos de serialização corretamente
CA2235: Marcar todos os campos não serializáveis
CA2237: Marcar tipos ISerializable com SerializableAttribute
CA2239: Fornecer métodos de desserialização para campos opcionais
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de