CA2229: Należy zaimplementować konstruktory serializacji
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2229 |
Tytuł | Zaimplementuj konstruktory serializacji |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Uwaga
Ta reguła została usunięta na platformie .NET 8, ponieważ powoduje konflikt z SYSLIB0051: starsze interfejsy API obsługi serializacji są przestarzałe.
Przyczyna
Typ implementuje System.Runtime.Serialization.ISerializable interfejs, nie jest delegatem ani interfejsem, a jeden z następujących warunków jest spełniony:
Typ nie ma konstruktora, który przyjmuje SerializationInfo obiekt i StreamingContext obiekt (podpis konstruktora serializacji).
Typ jest niezauczętowany, a modyfikator dostępu dla jego konstruktora serializacji nie jest chroniony (rodzina).
Typ jest zapieczętowany, a modyfikator dostępu dla jego konstruktora serializacji nie jest prywatny.
Opis reguły
Ta reguła jest odpowiednia dla typów, które obsługują serializację niestandardową. Typ obsługuje serializację niestandardową ISerializable , jeśli implementuje interfejs. Konstruktor serializacji jest wymagany do deserializacji lub ponownego utworzenia obiektów, które zostały serializowane przy użyciu ISerializable.GetObjectData metody .
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy zaimplementować konstruktora serializacji. Dla zamkniętej klasy należy ustawić konstruktor prywatny; w przeciwnym razie powinien być chroniony.
Kiedy pomijać ostrzeżenia
Nie pomijaj naruszenia reguły. Typ nie będzie deserializowalny i nie będzie działać w wielu scenariuszach.
Przykład
W poniższym przykładzie pokazano typ, który spełnia regułę.
[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);
}
}
Powiązane reguły
CA2237: Oznacz typy ISerializable za pomocą atrybutu SerializableAttribute