CA2239: Fornire metodi di deserializzazione per i campi facoltativi
TypeName |
ProvideDeserializationMethodsForOptionalFields |
CheckId |
CA2239 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Un tipo presenta un campo contrassegnato con l'attributo System.Runtime.Serialization.OptionalFieldAttribute e il tipo non fornisce metodi di gestione degli eventi di deserializzazione.
Descrizione della regola
L'attributo OptionalFieldAttribute non influisce sulla deserializzazione; un campo contrassegnato con l'attributo è serializzato. Il campo viene, tuttavia, ignorato durante la deserializzazione e mantiene il valore predefinito associato al tipo relativo. Per impostare il campo durante il processo di deserializzazione, è necessario dichiarare i gestori degli eventi di deserializzazione.
Come correggere le violazioni
Per correggere una violazione di questa regola, aggiungere al tipo i metodi di gestione degli eventi di deserializzazione.
Esclusione di avvisi
L'esclusione di un avviso da questa regola è sicura se il campo deve essere ignorato durante il processo di deserializzazione.
Esempio
Nell'esempio riportato di seguito viene illustrato un tipo con un campo opzionale e metodi di gestione degli eventi di deserializzazione.
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.
}
}
}
Regole correlate
CA2236: Chiamare metodi della classe base su tipi ISerializable
CA2240: Implementare ISerializable in modo corretto
CA2229: Implementare costruttori di serializzazione
CA2238: Implementare correttamente i metodi di serializzazione
CA2235: Contrassegnare tutti i campi non serializzabili
CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute