Udostępnij za pośrednictwem


CA2239: Dostarcz metody deserializacji pól opcjonalnych

TypeName

ProvideDeserializationMethodsForOptionalFields

CheckId

CA2239

Kategoria

Microsoft.Usage

Zmiana kluczowa

Niekluczowa

Przyczyna

Typ ma pole oznaczone przez atrybut OptionalFieldAttribute i nie zapewnia metod obsługi zdarzeń deserializacji.

Opis reguły

Atrybut OptionalFieldAttribute nie ma wpływu na serializację; pola oznaczone atrybutem jest serializowane.Jednak, pole jest ignorowane przy deserializacji i zachowuje domyślną wartość skojarzoną z jego typem.Obsługa zdarzenia deserializacji powinna być zadeklarowana tak, aby ustawiać wartość tego pola podczas procesu deserializacji.

Jak naprawić naruszenia

Ustalenie naruszenie tej zasady, należy dodać metody obsług zdarzenia deserializacji do typu.

Kiedy pominąć ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli pole ma być zignorowane podczas procesu deserializacji.

Przykład

Poniższy przykład pokazuje typ z opcjonalnym polem i metody obsługi zdarzeń deserializacji.

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

Powiązane reguły

CA2236: Wywołanie metod klasy podstawowej typu ISerializable

CA2240: Należy poprawnie zaimplementować ISerializable

CA2229: Należy zaimplementować konstruktory serializacji

CA2238: Należy poprawnie zaimplementować metody serializacji

CA2235: Należy oznaczyć wszystkie nieserializowane pola

CA2237: Należy oznaczyć typ ISerializable atrybutem SerializableAttribute

CA2120: Zabezpieczaj konstruktory serializacji