Partager via


CA2235 : Marquez tous les champs non sérialisés

TypeName

MarkAllNonSerializableFields

CheckId

CA2235

Catégorie

Microsoft.Usage

Modification avec rupture

Modification sans rupture

Cause

Un champ d'instance d'un type non sérialisable est déclaré dans un type sérialisable.

Description de la règle

Un type sérialisable est marqué avec l'attribut System.SerializableAttribute. Lorsque le type est sérialisé, une exception System.Runtime.Serialization.SerializationException est levée si un type contient un champ d'instance d'un type qui n'est pas sérialisable.

Comment corriger les violations

Pour corriger une violation de cette règle, appliquez l'attribut System.NonSerializedAttribute au champ qui n'est pas sérialisable.

Quand supprimer les avertissements

Supprimez uniquement un avertissement de cette règle en cas de déclaration d'un type System.Runtime.Serialization.ISerializationSurrogate qui autorise des instances du champ à être sérialisées et désérialisées.

Exemple

L'exemple suivant présente un type qui viole la règle et un autre qui satisfait la règle.

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

Règles connexes

CA2236 : Appelez les méthodes de la classe de base sur les types ISerializable

CA2240 : Implémentez ISerializable comme il se doit

CA2229 : Implémentez des constructeurs de sérialisation

CA2238 : Implémentez les méthodes de sérialisation comme il se doit

CA2237 : Marquer les types ISerializable avec SerializableAttribute

CA2239 : Spécifiez des méthodes de désérialisation pour les champs facultatifs

CA2120 : Sécurisez les constructeurs de sérialisation