Share via


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

Élément Valeur
ID de la règle CA2239
Category Microsoft.Usage
Modification avec rupture Sans rupture

Cause

Un type présente un champ marqué de 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 ainsi marqué est sérialisé. Il est toutefois ignoré lors de la 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 pendant le 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 prudent de supprimer un avertissement de cette règle si le champ doit être ignoré pendant le processus de désérialisation.

Exemple

L’exemple suivant montre un type comportant un champ facultatif et des méthodes de gestion des événements de désérialisation.

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

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