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