Condividi tramite


CA2239: Fornire metodi di deserializzazione per i campi facoltativi

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.

Come correggere le 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

CA2236: Chiamare metodi della classe base su tipi ISerializable

CA2240: Implementare ISerializable in modo corretto

CA2229: Implementare costruttori di serializzazione

CA2238: Implementare correttamente i metodi di serializzazione

CA2235: Contrassegnare tutti i campi non serializzabili

CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute

CA2120: Proteggere i costruttori di serializzazione