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

TypeName

ProvideDeserializationMethodsForOptionalFields

CheckId

CA2239

Catégorie

Microsoft.Usage

Modification avec rupture

Modification sans rupture

Cause

Un type présente un champ marqué avec l'attribut System.Runtime.Serialization.OptionalFieldAttribute et ne fournit aucune méthode de gestion des événements de désérialisation.

Description de la règle

L'attribut OptionalFieldAttribute n'a aucun effet sur la sérialisation ; un champ marqué avec l'attribut est sérialisé. Toutefois, le champ est ignoré en cas de désérialisation et conserve la valeur par défaut associée à son type. Les gestionnaires d'événements de désérialisation doivent être déclarés pour définir le champ au cours du processus de désérialisation.

Comment corriger les violations

Pour corriger une violation de cette règle, ajoutez au type des méthodes de gestion des événements de désérialisation.

Quand supprimer les avertissements

Il est possible de supprimer sans risque un avertissement de cette règle si le champ doit être ignoré au cours du processus de désérialisation.

Exemple

L'exemple suivant présente un type doté d'un champ et de méthodes de gestion des événements de désérialisation facultatifs.

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.
      }
   }
}

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

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

CA2237 : Marquer les types ISerializable avec SerializableAttribute

CA2120 : Sécurisez les constructeurs de sérialisation