Partilhar via


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

TypeName

ProvideDeserializationMethodsForOptionalFields

CheckId

CA2239

Categoria

Microsoft.Usage

Alteração Significativa

Sem Quebra

Causa

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

Descrição da Regra

O atributo de OptionalFieldAttribute não tem nenhum efeito na serialização; um campo marcado com o atributo é serializado.No entanto, o campo é ignorado na desserialização e retém o valor padrão associado ao 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, adicionar métodos de manipulação de eventos de desserialização para o tipo.

Quando Suprimir Alertas

É seguro suprimir um aviso dessa regra se o campo é ignorado durante o processo de desserialização.

Exemplo

O exemplo a seguir mostra um tipo com métodos de manipulação de um campo opcional e do 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 de classe base em tipos ISerializable

CA2240: implementar ISerializable corretamente

CA2229: implementar construtores de serialização

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

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

CA2237: marcar tipos ISerializable com SerializableAttribute

CA2120: proteger construtores de serialização