Condividi tramite


Contrassegnare tutti i campi non serializzabili

Aggiornamento: novembre 2007

TypeName

MarkAllNonSerializableFields

CheckId

CA2235

Category

Microsoft.Usage

Breaking Change

Non sostanziale

Causa

Un campo di istanza di un tipo non serializzabile viene dichiarato in un tipo serializzabile.

Descrizione della regola

Un tipo serializzabile è contrassegnato con l'attributo System.SerializableAttribute. Quando il tipo è serializzato, viene generata un'eccezione System.Runtime.Serialization.SerializationException se un tipo contiene un campo di istanza di un tipo non serializzabile.

Correzione di violazioni

Per correggere una violazione di questa regola, applicare l'attributo System.NonSerializedAttribute al campo non serializzabile.

Esclusione di avvisi

Escludere un avviso da questa regola solo se viene dichiarato un tipo System.Runtime.Serialization.ISerializationSurrogate che consente la serializzazione e la deserializzazione delle istanze del campo.

Esempio

Nell'esempio riportato di seguito vengono illustrati un tipo che viola la regola e un tipo che la soddisfa.

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

Regole correlate

Chiamare metodi della classe base su tipi ISerializable

Implementare ISerializable in modo corretto

Implementare costruttori di serializzazione

Implementare correttamente i metodi di serializzazione

Contrassegnare i tipi ISerializable con SerializableAttribute

Fornire metodi di deserializzazione per i campi facoltativi

Proteggere i costruttori di serializzazione