Partilhar via


CA2235: marcar todos os campos não serializáveis

TypeName

MarkAllNonSerializableFields

CheckId

CA2235

Categoria

Microsoft.Usage

Alteração Significativa

Sem Quebra

Causa

Um campo da instância de um tipo que não seja serializável é declarado em um tipo que é serializable.

Descrição da Regra

Um tipo serializável é um que é marcado com o atributo de SerializableAttribute .Quando o tipo é serializado de SerializationException , uma exceção será gerada se um tipo que contém um campo da instância de um tipo que não seja serializável.

Como Corrigir Violações

Para corrigir uma violação desta regra, aplicar o atributo de NonSerializedAttribute ao campo que não seja serializável.

Quando Suprimir Alertas

Suprima apenas um aviso dessa regra se um tipo de ISerializationSurrogate é declarado que permite que as instâncias do campo são serializadas e desserializado.

Exemplo

O exemplo a seguir mostra um tipo que viola a regra e um tipo que satisfaça a regra.

Imports System
Imports System.Runtime.Serialization

Namespace UsageLibrary

   Public Class Mouse

      Dim buttons As Integer 
      Dim scanTypeValue As String 

      ReadOnly Property NumberOfButtons As Integer 
         Get 
            Return buttons
         End Get 
      End Property 

      ReadOnly Property ScanType As String 
         Get 
            Return scanTypeValue
         End Get 
      End Property 

      Sub New(numberOfButtons As Integer, scanType As String)
         buttons = numberOfButtons
         scanTypeValue = scanType
      End Sub 

   End Class

   <SerializableAttribute> _ 
   Public Class InputDevices1

      ' Violates MarkAllNonSerializableFields. 
      Dim opticalMouse As Mouse 

      Sub New()
         opticalMouse = New Mouse(5, "optical") 
      End Sub 

   End Class

   <SerializableAttribute> _ 
   Public Class InputDevices2

      ' Satisfies MarkAllNonSerializableFields.
      <NonSerializedAttribute> _ 
      Dim opticalMouse As Mouse 

      Sub New()
         opticalMouse = New Mouse(5, "optical") 
      End Sub 

   End Class 

End Namespace
using System;
using System.Runtime.Serialization;

namespace UsageLibrary
{
   public class Mouse
   {
      int buttons;
      string scanTypeValue;

      public int NumberOfButtons
      {
         get { return buttons; }
      }

      public string ScanType
      {
         get { return scanTypeValue; }
      }

      public Mouse(int numberOfButtons, string scanType)
      {
         buttons = numberOfButtons;
         scanTypeValue = scanType;
      }
   }

   [SerializableAttribute]
   public class InputDevices1
   {
      // Violates MarkAllNonSerializableFields.
      Mouse opticalMouse;

      public InputDevices1()
      {
         opticalMouse = new Mouse(5, "optical"); 
      }
   }

   [SerializableAttribute]
   public class InputDevices2
   {
      // Satisfies MarkAllNonSerializableFields.
      [NonSerializedAttribute]
      Mouse opticalMouse;

      public InputDevices2()
      {
         opticalMouse = new Mouse(5, "optical"); 
      }
   }
}

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

CA2237: marcar tipos ISerializable com SerializableAttribute

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

CA2120: proteger construtores de serialização