Udostępnij za pośrednictwem


CA2239: Zapewnić deserialization metody pola opcjonalne

TypeName

ProvideDeserializationMethodsForOptionalFields

CheckId

CA2239

Kategoria

Microsoft.Usage

Zmiana kluczowa

Niekluczowa

Przyczyna

Typ ma pole oznaczone przez atrybut System.Runtime.Serialization.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 metody klasy bazowej typy ISerializable

CA2240: Wdrożenie ISerializable poprawnie

CA2229: Konstruktory serializacji wdrożenie

CA2238: Prawidłowo zaimplementować Serializacja metod

CA2235: Oznaczyć wszystkie pola nie można serializować

CA2237: Typy ISerializable znak z SerializableAttribute

CA2120: Konstruktory serializacji bezpiecznego