CA2229: Należy zaimplementować konstruktory serializacji
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
Kategoria |
Microsoft.Usage |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Typ implementuje interfejs ISerializable, nie jest obiektem delegowanym ani interfejsem, i jeden z następujących warunków jest spełniony:
Typ nie ma konstruktora, który przyjmuje obiekt SerializationInfo i obiekt StreamingContext (podpis konstruktora serializacji).
Typ jest niezamknięty i modyfikator dostępu do jego konstruktora serializacji nie jest chroniony (rodzina).
Typ jest zapieczętowany i modyfikator dostępu do jego konstruktora serializacji nie jest prywatny.
Opis reguły
Ta reguła jest istotna 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 były serializowane za pomocą metody ISerializable.GetObjectData.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy zaimplementować konstruktor serializacji.Dla zamkniętej klasy, należy ustawić konstruktor prywatnym; w przeciwnym razie powinien być chroniony.
Kiedy pominąć ostrzeżenia
Nie należy pomijać naruszenia tej reguły.Typ nie będzie deserializowalny i nie będzie działać w wielu scenariuszach.
Przykład
Poniższy przykład pokazuje typ, który spełnia regułę.
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);
}
}
}
Powiązane reguły
CA2237: Należy oznaczyć typ ISerializable atrybutem SerializableAttribute