Fornire metodi di deserializzazione per i campi facoltativi

Aggiornamento: novembre 2007

TypeName

ProvideDeserializationMethodsForOptionalFields

CheckId

CA2239

Category

Microsoft.Usage

Breaking Change

Non sostanziale

Causa

Un tipo presenta un campo contrassegnato con l'attributo System.Runtime.Serialization.OptionalFieldAttribute e il tipo non fornisce metodi di gestione degli eventi di deserializzazione.

Descrizione della regola

L'attributo OptionalFieldAttribute non influisce sulla deserializzazione; un campo contrassegnato con l'attributo è serializzato. Il campo viene, tuttavia, ignorato durante la deserializzazione e mantiene il valore predefinito associato al tipo relativo. Per impostare il campo durante il processo di deserializzazione, è necessario dichiarare i gestori degli eventi di deserializzazione.

Correzione di violazioni

Per correggere una violazione di questa regola, aggiungere al tipo i metodi di gestione degli eventi di deserializzazione.

Esclusione di avvisi

L'esclusione di un avviso da questa regola è sicura se il campo deve essere ignorato durante il processo di deserializzazione.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo con un campo opzionale e metodi di gestione degli eventi di deserializzazione.

Imports System
Imports System.Reflection
Imports System.Runtime.Serialization

<Assembly: AssemblyVersionAttribute("2.0.0.0")>
Namespace UsageLibrary

   <SerializableAttribute> _ 
   Public Class SerializationEventHandlers

      <OptionalFieldAttribute(VersionAdded := 2)> _ 
      Dim optionalField As Integer = 5

      <OnDeserializingAttribute> _ 
      Private Sub OnDeserializing(context As StreamingContext)
         optionalField = 5
      End Sub

      <OnDeserializedAttribute> _ 
      Private Sub OnDeserialized(context As StreamingContext)
         ' Set optionalField if dependent on other deserialized values.
      End Sub

   End Class

End Namespace
using System;
using System.Reflection;
using System.Runtime.Serialization;

[assembly: AssemblyVersionAttribute("2.0.0.0")]
namespace UsageLibrary
{
   [SerializableAttribute]
   public class SerializationEventHandlers
   {
      [OptionalFieldAttribute(VersionAdded = 2)]
      int optionalField = 5;

      [OnDeserializingAttribute]
      void OnDeserializing(StreamingContext context)
      {
         optionalField = 5;
      }

      [OnDeserializedAttribute]
      void OnDeserialized(StreamingContext context)
      {
         // Set optionalField if dependent on other deserialized values.
      }
   }
}

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 tutti i campi non serializzabili

Contrassegnare i tipi ISerializable con SerializableAttribute

Proteggere i costruttori di serializzazione