Partager via


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

Mise à jour : novembre 2007

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

Appelez les méthodes de la classe de base sur des types ISerializable

Implémentez ISerializable comme il se doit

Implémentez des constructeurs de sérialisation

Implémentez les méthodes de sérialisation comme il se doit

Marquez tous les champs non sérialisables

Marquer les types ISerializable avec SerializableAttribute

Sécurisez les constructeurs de sérialisation