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


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

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

TypeName

ImplementSerializationMethodsCorrectly

CheckId

CA2238

Категория

Microsoft.Usage

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

Критическое, если метод отображается за пределами сборки.

Не критическое, если метод не отображается за пределами сборки.

Причина

Метод, обрабатывающий событие сериализации, не имеет правильной подписи, возвращаемого типа или отображения.

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

Метод назначается обработчику событий сериализации путем применения одного из следующих атрибутов события сериализации.

Обработчики событий сериализации принимают один параметр типа System.Runtime.Serialization.StreamingContext, возвращают void и имеют отображение private.

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

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

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

Для этого правила отключать вывод предупреждений не следует.

Пример

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

Imports System
Imports System.Runtime.Serialization

Namespace UsageLibrary

   <SerializableAttribute> _ 
   Public Class SerializationEventHandlers

      <OnSerializingAttribute> _ 
      Private Sub OnSerializing(context As StreamingContext) 
      End Sub

      <OnSerializedAttribute> _ 
      Private Sub OnSerialized(context As StreamingContext) 
      End Sub

      <OnDeserializingAttribute> _ 
      Private Sub OnDeserializing(context As StreamingContext)
      End Sub

      <OnDeserializedAttribute> _ 
      Private Sub OnDeserialized(context As StreamingContext)
      End Sub

   End Class

End Namespace
using System;
using System.Runtime.Serialization;

namespace UsageLibrary
{
   [SerializableAttribute]
   public class SerializationEventHandlers
   {
      [OnSerializingAttribute]
      void OnSerializing(StreamingContext context) {}

      [OnSerializedAttribute]
      void OnSerialized(StreamingContext context) {}

      [OnDeserializingAttribute]
      void OnDeserializing(StreamingContext context) {}

      [OnDeserializedAttribute]
      void OnDeserialized(StreamingContext context) {}
   }
}

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

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

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

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

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

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

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

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