CA2236: Volejte metody třídy Base na typech ISerializable
Zboží | Hodnota |
---|---|
RuleId | CA2236 |
Kategorie | Microsoft.Usage |
Změna způsobující chybu | Nenarušující |
Příčina
Typ je odvozen od typu, který implementuje System.Runtime.Serialization.ISerializable rozhraní, a jedna z následujících podmínek je pravdivá:
Typ implementuje serializační konstruktor, tj. konstruktor s podpisem parametru System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext ale nevolá serializační konstruktor základního typu.
Typ implementuje metodu System.Runtime.Serialization.ISerializable.GetObjectData , ale nevolá GetObjectData metodu základního typu.
Popis pravidla
V procesu vlastní serializace typ implementuje metodu GetObjectData serializace svých polí a konstruktor serializace de-serializace pole. Pokud typ je odvozen od typu, který implementuje ISerializable rozhraní, základní typ GetObjectData metoda a serializace konstruktor by měly být volány serializace/de-serializace pole základního typu. V opačném případě nebude typ serializován a de-serializován správně. Všimněte si, že pokud odvozený typ nepřidá žádná nová pole, typ nemusí implementovat metodu GetObjectData ani konstruktor serializace nebo volat ekvivalenty základního typu.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, volejte metodu základního typu GetObjectData nebo konstruktor serializace z odpovídající odvozené metody nebo konstruktoru odvozeného typu.
Kdy potlačit upozornění
Nepotlačujte upozornění na toto pravidlo.
Příklad
Následující příklad ukazuje odvozený typ, který splňuje pravidlo voláním serializace konstruktoru a GetObjectData metody základní třídy.
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);
}
}
}
Související pravidla
CA2240: Implementujte správně ISerializable
CA2229: Implementovat serializační konstruktory
CA2238: Implementujte správně metody serializace
CA2235: Označte všechna neserializovatelná pole
CA2237: Označte typy ISerializable pomocí SerializableAttribute
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro