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

TypeName

MarkAllNonSerializableFields

CheckId

CA2235

<strong>Categoria</strong>

Microsoft.Usage

Alteração significativa

Não separável

Causa

Um campo de instância de um tipo que não é serializável está declarado em um tipo que pode ser serializado.

Descrição da regra

Um tipo serializável é aquele que está marcado com o System.SerializableAttribute atributo.Quando o tipo for serializado, um System.Runtime.Serialization.SerializationException exceção é lançada se um tipo contém um campo de instância de um tipo que não é serializável.

Como corrigir violações

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

Quando suprimir avisos

Suprimir somente um aviso da regra, se um System.Runtime.Serialization.ISerializationSurrogate tipo é declarado que permite que as instâncias do campo a ser serializado 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 os métodos de classe base nos tipos de ISerializable

CA2240: ISerializable de implementar corretamente

CA2229: Construtores de serialização de implementar

CA2238: Implementar métodos de serialização corretamente

CA2237: Os tipos ISerializable da marca com o SerializableAttribute

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

CA2120: Construtores de serialização seguro