CA2239 : Spécifiez des méthodes de désérialisation pour les champs facultatifsCA2239: Provide deserialization methods for optional fields

TypeNameTypeName ProvideDeserializationMethodsForOptionalFieldsProvideDeserializationMethodsForOptionalFields
CheckIdCheckId CA2239CA2239
CategoryCategory Microsoft.UsageMicrosoft.Usage
Modification avec ruptureBreaking Change Sans ruptureNon Breaking

CauseCause

Un type a un champ qui est marqué avec la System.Runtime.Serialization.OptionalFieldAttribute attribut et le type ne fournit pas de méthodes de gestion des événements de désérialisation.A type has a field that is marked with the System.Runtime.Serialization.OptionalFieldAttribute attribute and the type does not provide de-serialization event handling methods.

Description de la règleRule Description

Le OptionalFieldAttribute attribut n’a aucun effet sur la sérialisation ; un champ marqué avec l’attribut est sérialisé.The OptionalFieldAttribute attribute has no effect on serialization; a field marked with the attribute is serialized. Toutefois, le champ est ignoré lors de la sérialisation de déduplication et conserve la valeur par défaut associée à son type.However, the field is ignored on de-serialization and retains the default value associated with its type. 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.De-serialization event handlers should be declared to set the field during the de-serialization process.

Comment corriger les violationsHow to Fix Violations

Pour corriger une violation de cette règle, ajoutez des méthodes pour le type de gestion des événements de désérialisation.To fix a violation of this rule, add de-serialization event handling methods to the type.

Quand supprimer les avertissementsWhen to Suppress Warnings

Il est possible de supprimer un avertissement de cette règle si le champ doit être ignoré pendant le processus de désérialisation.It is safe to suppress a warning from this rule if the field should be ignored during the de-serialization process.

ExempleExample

L’exemple suivant montre un type avec un champ facultatif et l’événement de désérialisation des méthodes de gestion.The following example shows a type with an optional field and de-serialization event handling methods.

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

CA2236 : Appelez les méthodes de la classe de base sur les types ISerializableCA2236: Call base class methods on ISerializable types

CA2240 : Implémentez ISerializable correctementCA2240: Implement ISerializable correctly

CA2229 : Implémentez des constructeurs de sérialisationCA2229: Implement serialization constructors

CA2238 : Implémentez les méthodes de sérialisation correctementCA2238: Implement serialization methods correctly

CA2235 : Marquez tous les champs non sérialisablesCA2235: Mark all non-serializable fields

CA2237 : Marquez les types ISerializable avec SerializableAttributeCA2237: Mark ISerializable types with SerializableAttribute

CA2120 : Sécurisez les constructeurs de sérialisationCA2120: Secure serialization constructors