Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA2229 |
| Tytuł | Zaimplementuj konstruktory serializacji |
| Kategoria | Użycie |
| Poprawka łamiąca lub nienaruszająca | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Nie. |
| Zastosowane języki | C# i Visual Basic |
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 obiekty SerializationInfo i StreamingContext (sygnatura 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ą, jeśli implementuje interfejs ISerializable. 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 konstruktor powinien być prywatny; w przeciwnym razie należy go chronić.
Kiedy pomijać ostrzeżenia
Nie tuszuj 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 atrybutem SerializableAttribute