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


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

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

TypeName

CallBaseClassMethodsOnISerializableTypes

CheckId

CA2236

Категория

Microsoft.Usage

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

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

Причина

Тип происходит от типа, реализующего интерфейс System.Runtime.Serialization.ISerializable, при этом выполняется одно из следующих условий:

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

В настраиваемом процессе сериализации тип реализует метод GetObjectData для сериализации своих полей и конструктор сериализации для отмены сериализации полей. Если тип происходит от типа, реализующего интерфейс ISerializable, то нужно вызывать метод базового типа GetObjectData и конструктор сериализации для сериализации и отмены сериализации полей базового типа. В противном сериализация и отмена сериализации типа не будут выполнены правильно. Обратите внимание, что если в производном типе не добавляются никакие новые поля, тип не должен реализовывать метод GetObjectData или конструктор сериализации и не должен вызывать эквиваленты базового типа.

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

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

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

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

Пример

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

Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions

Namespace UsageLibrary

   <SerializableAttribute> _ 
   Public Class BaseType
      Implements ISerializable

      Dim baseValue As Integer

      Sub New()
         baseValue = 3
      End Sub

      Protected Sub New( _ 
         info As SerializationInfo, context As StreamingContext)

         baseValue = info.GetInt32("baseValue")

      End Sub

      <SecurityPermissionAttribute(SecurityAction.Demand, _ 
          SerializationFormatter := True)> _ 
      Overridable Sub GetObjectData( _ 
         info As SerializationInfo, context As StreamingContext) _ 
         Implements ISerializable.GetObjectData

         info.AddValue("baseValue", baseValue)

      End Sub

   End Class

   <SerializableAttribute> _ 
   Public Class DerivedType: Inherits BaseType

      Dim derivedValue As Integer

      Sub New()
         derivedValue = 4
      End Sub

      Protected Sub New( _ 
         info As SerializationInfo, context As StreamingContext)

         MyBase.New(info, context)      
         derivedValue = info.GetInt32("derivedValue")

      End Sub

      <SecurityPermissionAttribute(SecurityAction.Demand, _ 
          SerializationFormatter := True)> _ 
      Overrides Sub GetObjectData( _ 
         info As SerializationInfo, context As StreamingContext)

         info.AddValue("derivedValue", derivedValue)
         MyBase.GetObjectData(info, context)

      End Sub

   End Class

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

namespace UsageLibrary
{
   [SerializableAttribute]
   public class BaseType : ISerializable
   {
      int baseValue;

      public BaseType()
      {
         baseValue = 3;
      }

      protected BaseType(
         SerializationInfo info, StreamingContext context)
      {
         baseValue = info.GetInt32("baseValue");
      }

      [SecurityPermissionAttribute(SecurityAction.Demand, 
          SerializationFormatter = true)]
      public virtual void GetObjectData(
         SerializationInfo info, StreamingContext context)
      {
         info.AddValue("baseValue", baseValue);
      }
   }

   [SerializableAttribute]
   public class DerivedType : BaseType
   {
      int derivedValue;

      public DerivedType()
      {
         derivedValue = 4;
      }

      protected DerivedType(
         SerializationInfo info, StreamingContext context) : 
         base(info, context)
      {
         derivedValue = info.GetInt32("derivedValue");
      }

      [SecurityPermissionAttribute(SecurityAction.Demand, 
          SerializationFormatter = true)]
      public override void GetObjectData(
         SerializationInfo info, StreamingContext context)
      {
         info.AddValue("derivedValue", derivedValue);
         base.GetObjectData(info, context);
      }
   }
}

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

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

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

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

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

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

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

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