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