Compartilhar via


CA2237: marcar tipos ISerializable com SerializableAttribute

TypeName

MarkISerializableTypesWithSerializable

CheckId

CA2237

Categoria

Microsoft.Usage

Alteração Significativa

Sem Quebra

Causa

Um tipo externamente visível implementa a interface de ISerializable e o tipo não é marcado com o atributo de SerializableAttribute .A regra ignora os tipos derivados cujo tipo de base não é serializable.

Descrição da Regra

Para ser reconhecido por Common Language Runtime como serializável, os tipos devem ser marcados com o atributo de SerializableAttribute mesmo se o tipo usa uma rotina de serialização personalizada com a implementação da interface de ISerializable .

Como Corrigir Violações

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

Quando Suprimir Alertas

Não suprima um aviso desta regra para classes de exceção porque devem ser serializáveis funcionar corretamente pelos domínios de aplicativo.

Exemplo

O exemplo a seguir mostra um tipo que viola a regra.Remover a linha do atributo de SerializableAttribute para atender 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 de classe base em tipos ISerializable

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

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

CA2120: proteger construtores de serialização