Compartir a través de


CA2235: Marcar todos los campos no serializables

TypeName

MarkAllNonSerializableFields

Identificador de comprobación

CA2235

Categoría

Microsoft.Usage

Cambio problemático

No

Motivo

Un campo de instancia de un tipo que no es serializable se declara en un tipo que es serializable.

Descripción de la regla

Un tipo serializable es aquel marcado con el atributo SerializableAttribute.Cuando se serializa el tipo, se produce una excepción SerializationException si un tipo contiene un campo de instancia de un tipo que no es serializable.

Cómo corregir infracciones

Para corregir una infracción de esta regla, aplique el atributo NonSerializedAttribute al campo que no es serializable.

Cuándo suprimir advertencias

Sólo suprima ninguna advertencia de esta regla si se declara un tipo ISerializationSurrogate que permite deserializar instancias del campo.

Ejemplo

El ejemplo siguiente muestra un tipo que infringe la regla y otro que la cumple.

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

Reglas relacionadas

LCA2236: Llamar a métodos de clase base en tipos ISerializable

CA2240: Implementar ISerializable correctamente

CA2229: Implementar constructores de serialización

CA2238: Implementar los métodos de serialización de forma correcta

CA2237: Marcar los tipos ISerializable con SerializableAttribute

CA2239: Proporcionar métodos de deserialización para campos opcionales

CA2120: Proteger los constructores de serializaciones