CA2237: Tipos de ISerializable de marca com o SerializableAttribute

TypeName

MarkISerializableTypesWithSerializable

CheckId

CA2237

<strong>Categoria</strong>

Microsoft.Usage

Alteração significativa

Não separável

Causa

Um tipo visível externamente implementa o System.Runtime.Serialization.ISerializable interface e o tipo não está marcado com o System.SerializableAttribute atributo. A regra ignora os tipos derivados cujo tipo base não é serializável.

Descrição da regra

Para ser reconhecido pelo common language runtime como serializável, os tipos devem ser marcados com o SerializableAttribute atributo mesmo se o tipo usa uma rotina de serialização personalizada por meio da implementação da ISerializable interface.

Como corrigir violações

Para corrigir uma violação desta regra, aplicar o SerializableAttribute atributo para o tipo.

Quando suprimir avisos

Não suprimir um aviso da regra para classes de exceção como deve ser serializáveis para funcionar corretamente em domínios de aplicativo.

Exemplo

O exemplo a seguir mostra um tipo que viola a regra. Descomente a SerializableAttribute a linha de atributo para satisfazer a regra.

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

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);
      }
   }
}

Regras relacionadas

CA2236: Chamar métodos da classe base nos tipos de ISerializable

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

CA2239: Fornecer métodos de desserialização de campos opcionais

CA2120: Proteger os construtores de serialização