Поделиться через


CA2239: предоставляйте методы десериализации для необязательных полей

TypeName

ProvideDeserializationMethodsForOptionalFields

CheckId

CA2239

Категория

Microsoft.Usage

Критическое изменение

Не критическое

Причина

Тип имеет поле с атрибутом OptionalFieldAttribute и не предоставляет методы десериализации события.

Описание правила

Атрибут OptionalFieldAttribute не влияет на сериализацию. Поле с таким атрибутом сериализуется.Однако поле не обрабатывается при десериализации и сохраняет значение по умолчанию, связанное с типом поля.Для обработки поля в процессе десериализации следует объявлять обработчики событий десериализации.

Устранение нарушений

Чтобы устранить нарушение этого правила, добавьте в тип обработчики событий десериализации.

Отключение предупреждений

Можно безопасно отключать предупреждения этого правила, если поле нужно пропустить в процессе десериализации.

Пример

В следующем примере показан тип с необязательным полем и методы обработки событий десериализации.

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

Связанные правила

CA2236: вызывайте методы базового класса для типов ISerializable

CA2240: правильно реализуйте ISerializable

CA2229: применяйте конструкторы сериализации

CA2238: следует правильно реализовывать методы сериализации

CA2235: помечайте все несериализуемые поля

CA2237: пометьте типы ISerializable атрибутом SerializableAttribute

CA2120: обеспечьте безопасность конструкторов сериализации