CA2229: Implementera serialiseringskonstruktorer
Property | Värde |
---|---|
Regel-ID | CA2229 |
Title | Implementera serialiseringskonstruktorer |
Kategori | Användning |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Kommentar
Den här regeln togs bort i .NET 8 eftersom den står i konflikt med SYSLIB0051: API:er för äldre serialiseringsstöd är föråldrade.
Orsak
Typen implementerar System.Runtime.Serialization.ISerializable gränssnittet, är inte ett ombud eller gränssnitt och något av följande villkor är sant:
Typen har ingen konstruktor som tar ett SerializationInfo objekt och ett StreamingContext objekt (serialiseringskonstruktorns signatur).
Typen är oförseglat och åtkomstmodifieraren för dess serialiseringskonstruktor är inte skyddad (familj).
Typen är förseglad och åtkomstmodifieraren för dess serialiseringskonstruktor är inte privat.
Regelbeskrivning
Den här regeln är relevant för typer som stöder anpassad serialisering. En typ stöder anpassad serialisering om den ISerializable implementerar gränssnittet. Serialiseringskonstruktorn krävs för att deserialisera eller återskapa objekt som har serialiserats med hjälp av ISerializable.GetObjectData metoden.
Så här åtgärdar du överträdelser
Om du vill åtgärda ett brott mot den här regeln implementerar du serialiseringskonstruktorn. För en förseglad klass gör du konstruktorn privat; annars gör du det skyddat.
När du ska ignorera varningar
Undertryck inte en överträdelse av regeln. Typen kommer inte att vara deserializable och fungerar inte i många scenarier.
Exempel
I följande exempel visas en typ som uppfyller regeln.
[Serializable]
public class SerializationConstructorsRequired : ISerializable
{
private int n1;
// This is a regular constructor.
public SerializationConstructorsRequired()
{
n1 = -1;
}
// This is the serialization constructor.
// Satisfies rule: ImplementSerializationConstructors.
protected SerializationConstructorsRequired(
SerializationInfo info,
StreamingContext context)
{
n1 = (info.GetValue(nameof(n1), typeof(int)) != null) ?
(int)info.GetValue(nameof(n1), typeof(int))! :
-1;
}
// The following method serializes the instance.
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue(nameof(n1), n1);
}
}
Relaterade regler
CA2237: Markera ISerializable-typer med SerializableAttribute