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