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

Elemento Valor
RuleId CA2239
Category Microsoft.Usage
Cambio importante Poco problemático

Causa

Un tipo tiene un campo que está marcado con el atributo System.Runtime.Serialization.OptionalFieldAttribute y el tipo no proporciona 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 serializa un campo marcado con el atributo. Sin embargo, el campo se omite en la deserialización y conserva el valor predeterminado asociado a su tipo. Los controladores de eventos de deserialización deben declararse para establecer el campo durante el proceso de deserialización.

Cómo corregir infracciones

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

Cuándo suprimir las advertencias

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

Ejemplo

En el ejemplo siguiente se muestra un tipo con un campo opcional y métodos de control de eventos de deserialización.

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

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

CA2240: Implementar ISerializable correctamente

CA2229: Implementar constructores de serialización

CA2238: Implementar métodos de serialización correctamente

CA2235: Marcar todos los campos no serializables

CA2237: Marcar los tipos ISerializable con SerializableAttribute

CA2120: Proteger los constructores de serializaciones