CA2229:シリアル化コンストラクターを実装します

プロパティ
ルール ID CA2229
Title シリアル化コンストラクターを実装します
[カテゴリ] 使用方法
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 いいえ

Note

この規則は、SYSLIB0051: レガシ シリアル化サポート API は廃止されましたと競合するため、.NET 8 で削除されました。

原因

この型は System.Runtime.Serialization.ISerializable インターフェイスを実装するものであり、デリゲートでもインターフェイスでもなく、次のいずれかの条件が当てはまります。

  • SerializationInfo オブジェクトと StreamingContext オブジェクト (シリアル化コンストラクターのシグネチャ) を受け取るコンストラクターはこの型では使用できません。

  • この型はアンシールドであり、そのシリアル化コンストラクターのアクセス修飾子は protected (family) ではありません。

  • この型はシールドであり、そのシリアル化コンストラクターのアクセス修飾子は private ではありません。

規則の説明

この規則は、カスタム シリアル化をサポートする型に関連します。 ある型で ISerializable インターフェイスが実装される場合、その型はカスタム シリアル化をサポートします。 シリアル化コンストラクターは、ISerializable.GetObjectData メソッドを使用してシリアル化されているオブジェクトの逆シリアル化または再作成に必要です。

違反の修正方法

この規則違反を修正するには、シリアル化コンストラクターを実装します。 シールされたクラスの場合、コンストラクターをプライベートにするか、プロテクトにします。

どのようなときに警告を抑制するか

この規則の違反は抑制しないでください。 この型は逆シリアル化できず、さまざまなシナリオで機能しません。

次の例は、この規則を満たす型を示しています。

[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);
    }
}

CA2237:ISerializable 型を SerializableAttribute に設定します

関連項目