CA2235: Alle nicht serialisierbaren Felder markieren

TypeName

MarkAllNonSerializableFields

CheckId

CA2235

Kategorie

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein Instanzenfeld eines Typs, der nicht serialisierbar ist, ist in einem serialisierbaren Typ deklariert.

Regelbeschreibung

Ein serialisierbarer Typ wird mit dem System.SerializableAttribute-Attribut markiert.Wenn der Typ serialisiert ist, wird eine System.Runtime.Serialization.SerializationException-Ausnahme ausgelöst, falls ein Typ ein Instanzenfeld eines nicht serialisierbaren Typs enthält.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, wenden Sie das System.NonSerializedAttribute-Attribut auf das nicht serialisierbare Feld an.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie nur dann eine Warnung dieser Regel, wenn ein System.Runtime.Serialization.ISerializationSurrogate-Typ deklariert wird, der die Serialisierung und Deserialisierung von Instanzen des Felds zulässt.

Beispiel

Das folgende Beispiel zeigt einen Typ, der gegen die Regel verstößt, und einen Typ, der der Regel entspricht.

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

Verwandte Regeln

CA2236: Basisklassenmethoden auf ISerializable-Typen aufrufen

CA2240: ISerializable ordnungsgemäß implementieren

CA2229: Serialisierungskonstruktoren implementieren

CA2238: Serialisierungsmethoden korrekt implementieren

CA2237: Markieren von ISerializable-Typen mit SerializableAttribute

CA2239: Deserialisierungsmethoden für optionale Felder angeben

CA2120: Sichere Serialisierungskonstruktoren