Compartir a través de


CA2235: Marcar todos los campos no serializables

Nombre de tipo

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 System.SerializableAttribute.Cuando se serializa el tipo, se produce una excepción System.Runtime.Serialization.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 System.NonSerializedAttribute al campo que no es serializable.

Cuándo suprimir advertencias

Sólo suprima ninguna advertencia de esta regla si se declara un tipo System.Runtime.Serialization.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