Вызывайте методы базового класса для типов ISerializable
Обновлен: Ноябрь 2007
TypeName |
CallBaseClassMethodsOnISerializableTypes |
CheckId |
CA2236 |
Категория |
Microsoft.Usage |
Критическое изменение |
Не критическое |
Причина
Тип происходит от типа, реализующего интерфейс System.Runtime.Serialization.ISerializable, при этом выполняется одно из следующих условий:
Тип реализует конструктор сериализации, то есть подписью параметров System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext, но не вызывает конструктор сериализации базового типа.
Тип реализует метод ISerializable.GetObjectData, но не вызывает метод GetObjectData базового типа.
Описание правила
В настраиваемом процессе сериализации тип реализует метод 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
Предоставляйте методы десериализации для необязательных полей