CA2235: Marcar todos los campos no serializablesCA2235: Mark all non-serializable fields

TypeNameTypeName MarkAllNonSerializableFieldsMarkAllNonSerializableFields
Identificador de comprobaciónCheckId CA2235CA2235
CategoríaCategory Microsoft.UsageMicrosoft.Usage
Cambio problemáticoBreaking Change No trascendentalNon Breaking

MotivoCause

Un campo de instancia de un tipo que no es serializable se declara en un tipo que es serializable.An instance field of a type that is not serializable is declared in a type that is serializable.

Descripción de la reglaRule description

Un tipo serializable es aquel que está marcado con el System.SerializableAttribute atributo.A serializable type is one that is marked with the System.SerializableAttribute attribute. Cuando se serializa el tipo, un System.Runtime.Serialization.SerializationException excepción se produce si un tipo contiene un campo de instancia de un tipo que no es serializable.When the type is serialized, a System.Runtime.Serialization.SerializationException exception is thrown if a type contains an instance field of a type that is not serializable.

Cómo corregir infraccionesHow to fix violations

Para corregir una infracción de esta regla, aplique el System.NonSerializedAttribute atributo en el campo que no es serializable.To fix a violation of this rule, apply the System.NonSerializedAttribute attribute to the field that is not serializable.

Cuándo Suprimir advertenciasWhen to suppress warnings

Sólo suprima una advertencia de esta regla si un System.Runtime.Serialization.ISerializationSurrogate tipo se declara que permite que las instancias del campo al que se serializan y deserializan.Only suppress a warning from this rule if a System.Runtime.Serialization.ISerializationSurrogate type is declared that allows instances of the field to be serialized and deserialized.

EjemploExample

El ejemplo siguiente muestra un tipo que infringe la regla y un tipo que cumple la regla.The following example shows a type that violates the rule and a type that satisfies the rule.

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

CA2236: Llamar a métodos de clase base en tipos ISerializableCA2236: Call base class methods on ISerializable types

CA2240: Implementar ISerializable correctamenteCA2240: Implement ISerializable correctly

CA2229: Implementar constructores de serializaciónCA2229: Implement serialization constructors

CA2238: Implementar métodos de serialización correctamenteCA2238: Implement serialization methods correctly

CA2237: Marcar los tipos ISerializable con SerializableAttributeCA2237: Mark ISerializable types with SerializableAttribute

CA2239: Proporcionar métodos de deserialización para campos opcionalesCA2239: Provide deserialization methods for optional fields

CA2120: Proteger los constructores de serializacionesCA2120: Secure serialization constructors