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


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

Обновлен: Ноябрь 2007

TypeName

ProvideDeserializationMethodsForOptionalFields

CheckId

CA2239

Категория

Microsoft.Usage

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

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

Причина

Тип имеет поле с атрибутом System.Runtime.Serialization.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.
      }
   }
}

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

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

Правильно реализуйте ISerializable

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

Правильно реализовывать методы сериализации

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

Помечайте типы ISerializable атрибутом SerializableAttribute

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