CA2229: Implementovat serializační konstruktory
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
Kategorie |
Microsoft.Usage |
Narušující změna |
Nenarušující |
Příčina
Typ implementuje rozhraní ISerializable, není delegátem ani rozhraním a je splněna jedna z následujících podmínek:
Typ neobsahuje konstruktor, který přebírá objekt SerializationInfo a objekt StreamingContext (podpis konstruktoru serializace).
Typ není zapečetěn a modifikátor přístupu pro jeho konstruktor serializace není chráněný (family).
Typ je zapečetěn a modifikátor přístupu pro jeho konstruktor serializace není privátní.
Popis pravidla
Toto pravidlo platí pro typy, které podporují vlastní serializaci.Typ podporuje vlastní serializaci, pokud implementuje rozhraní ISerializable.Konstruktor serializace je vyžadován pro rekonstrukci nebo opětovné vytvoření objektů, které byly serializovány pomocí metody ISerializable.GetObjectData.
Jak vyřešit porušení
Implementací konstruktoru serializace se vyřeší porušení tohoto pravidla.Pro zapouzdřené třídy by měl být konstruktor privátní, jinak by měl být chráněný.
Kdy potlačit upozornění
Nepotlačujte porušení tohoto pravidla.Typ nebude možné zrekonstruovat a v mnoha případech nebude pracovat.
Příklad
Následující příklad ukazuje typ, který splňuje toto pravidlo.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
namespace UsageLibrary
{
[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 = (int) info.GetValue("n1", typeof(int));
}
// The following method serializes the instance.
[SecurityPermission(SecurityAction.LinkDemand,
Flags=SecurityPermissionFlag.SerializationFormatter)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue("n1", n1);
}
}
}
Související pravidla
CA2237: Označte typy ISerializable pomocí SerializableAttribute