Compartir a través de


CA2239: Proporcionar métodos de deserialización para campos opcionales

TypeName

ProvideDeserializationMethodsForOptionalFields

Identificador de comprobación

CA2239

Categoría

Microsoft.Usage

Cambio problemático

No

Motivo

Un tipo tiene un campo que se marca con el atributo OptionalFieldAttribute y el tipo no proporciona los métodos de control de eventos de deserialización.

Descripción de la regla

El atributo OptionalFieldAttribute no tiene ningún efecto en la serialización; se serializan los campos marcados con el atributo.Sin embargo, el campo se omite en la deserialización y mantiene el valor predeterminado asociado a su tipo.Los controladores de eventos de deserialización se deben declarar para establecer el campo durante el proceso de deserialización.

Cómo corregir infracciones

Para corregir una infracción de esta regla, agregue al tipo los métodos de control de eventos de deserialización.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla si el campo se debe omitir durante el proceso de deserialización.

Ejemplo

El ejemplo siguiente muestra un tipo con un campo opcional y los métodos de control de eventos de deserialización.

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

Reglas relacionadas

LCA2236: Llamar a métodos de clase base en tipos ISerializable

CA2240: Implementar ISerializable correctamente

CA2229: Implementar constructores de serialización

CA2238: Implementar los métodos de serialización de forma correcta

CA2235: Marcar todos los campos no serializables

CA2237: Marcar los tipos ISerializable con SerializableAttribute

CA2120: Proteger los constructores de serializaciones