CA2229: Serialisatieconstructors implementeren
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2229 |
Titel | Serialisatieconstructors implementeren |
Categorie | Gebruik |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Nr. |
Notitie
Deze regel is verwijderd in .NET 8 omdat deze conflicteert met SYSLIB0051: Verouderde serialisatie-ondersteunings-API's zijn verouderd.
Oorzaak
Het type implementeert de System.Runtime.Serialization.ISerializable interface, is geen gemachtigde of interface en een van de volgende voorwaarden is waar:
Het type heeft geen constructor die een SerializationInfo object en een StreamingContext object gebruikt (de handtekening van de serialisatieconstructor).
Het type is niet verzegeld en de toegangsmodifier voor de serialisatieconstructor is niet beveiligd (familie).
Het type is verzegeld en de toegangsmodifier voor de serialisatieconstructor is niet privé.
Beschrijving van regel
Deze regel is relevant voor typen die ondersteuning bieden voor aangepaste serialisatie. Een type ondersteunt aangepaste serialisatie als deze de ISerializable interface implementeert. De serialisatieconstructor is vereist voor het deserialiseren of opnieuw maken van objecten die zijn geserialiseerd met behulp van de ISerializable.GetObjectData methode.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, implementeert u de serialisatieconstructor. Voor een verzegelde klasse maakt u de constructor privé; anders moet u deze beveiligen.
Wanneer waarschuwingen onderdrukken
Een schending van de regel niet onderdrukken. Het type is niet ontserialiseerd en werkt niet in veel scenario's.
Opmerking
In het volgende voorbeeld ziet u een type dat voldoet aan de regel.
[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);
}
}
Gerelateerde regels
CA2237: Mark ISerializable types with SerializableAttribute