CA2239: Fornecer métodos de desserialização de campos opcionais

TypeName

ProvideDeserializationMethodsForOptionalFields

CheckId

CA2239

<strong>Categoria</strong>

Microsoft.Usage

Alteração significativa

Não separável

Causa

Um tipo tem um campo que está marcado com o System.Runtime.Serialization.OptionalFieldAttribute atributo e o tipo não fornece métodos de manipulação de eventos de desserialização.

Descrição da regra

O OptionalFieldAttribute atributo não tem efeito sobre a serialização; um campo marcado com o atributo é serializado. No entanto, o campo será ignorado na desserialização e mantém o valor padrão associado ao seu tipo. Os manipuladores de eventos de desserialização devem ser declarados para definir o campo durante o processo de desserialização.

Como corrigir violações

Para corrigir uma violação desta regra, adicione métodos ao tipo de manipulação de eventos de desserialização.

Quando suprimir avisos

É seguro eliminar um aviso esta regra se o campo deve ser ignorado durante o processo de desserialização.

Exemplo

O exemplo a seguir mostra os métodos de tratamento de um tipo com um campo opcional e o evento de desserialização.

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

Regras relacionadas

CA2236: Chamar métodos da classe base nos tipos de ISerializable

CA2240: Implementa ISerializable corretamente

CA2229: Implementar os construtores de serialização

CA2238: Implementar métodos de serialização corretamente

CA2235: Marcar todos os campos não serializáveis

CA2237: Tipos de ISerializable de marca com o SerializableAttribute

CA2120: Proteger os construtores de serialização