次の方法で共有


SYSLIB0051: レガシ シリアル化サポート API は廃止されました

.NET 8 以降では、次の種類の API は廃止されています。 これらをコードで呼び出すと、コンパイル時に警告 SYSLIB0051 が生成されます。

影響を受ける API の完全なリストについては、廃止された API - SYSLIB0051 に関する記述を参照してください。

回避策

  • System.Exception から派生したカスタム型を作成した場合は、本当にシリアル化可能にする必要があるかどうかを検討してください。 例外のシリアル化は主にリモート処理をサポートすることを目的としており、リモート処理のサポートは .NET Core 1.0 で削除されたため、シリアル化可能にする必要はない可能性があります。

    次のコード スニペットに示すようなカスタム例外型が定義されている場合は、[Serializable] 属性、シリアル化コンストラクター、および GetObjectData(SerializationInfo, StreamingContext) メソッドのオーバーライドを削除するだけです。

    [Serializable] // Remove this attribute.
    public class MyException : Exception
    {
        public MyException() { }
        public MyException(string message) : base(message) { }
        public MyException(string message, Exception inner) : base(message, inner) { }
    
        // Remove this constructor.
        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            // ...
        }
    
        // Remove this method.
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // ...
    
            base.GetObjectData(info, context);
        }
    }
    

    たとえば、API 互換性要件によって制約されたライブラリを生成する場合など、カスタム例外型からこれらの API を削除できない場合があります。 この場合、次のコードに示すように、SYSLIB0051 診断コードを使用して、独自のシリアル化コンストラクターと GetObjectData メソッドを廃止することをお勧めします。 シリアル化インフラストラクチャ自体の外部の誰もこれらの API を呼び出す必要がないことが理想的であるため、廃止が影響するのは、カスタム例外型をサブクラス化する他の型のみであるべきです。 カスタム例外型をキャッチ、構築、またはその他の方法で使用するユーザーにウイルス的な影響を与えるべきではありません。

    [Serializable]
    public class MyException : Exception
    {
        public MyException() { }
        public MyException(string message) : base(message) { }
        public MyException(string message, Exception inner) : base(message, inner) { }
    
        [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to the serialization ctor.
        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            // ...
        }
    
        [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to GetObjectData.
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // ...
    
            base.GetObjectData(info, context);
        }
    }
    

    .NET Framework と .NET 8 以降をクロスターゲットする場合は、#if ステートメントを使用して、条件付きで廃止を適用できます。 これは、.NET チームがランタイムをクロスターゲットするときに .NET ライブラリ コード ベース内で使用するのと同じ戦略です。

    [Serializable]
    public class MyException : Exception
    {
        // ...
    
    #if NET8_0_OR_GREATER
        [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to the serialization ctor
    #endif
        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            // ...
        }
    
    #if NET8_0_OR_GREATER
        [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to GetObjectData
    #endif
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // ...
    
            base.GetObjectData(info, context);
        }
    }
    
    
  • [Serializable] で属性付きの .NET 型をサブクラス化する型を宣言し、SYSLIB0051 警告を受け取る場合は、前の箇条書きのカスタム例外型のガイダンスに従ってください。

ヒント

[Serializable] カスタム型で .NET 型がサブクラス化されない場合、SYSLIB0051 警告は表示されません。 しかし、System.Text.Json のような最新のシリアル化ライブラリでは必要ないので、この方法で型に注釈を付けないようにすることをお勧めします。 [Serializable] 属性と ISerializable インターフェイスを削除することを検討してください。 代わりに、シリアル化ライブラリを利用し、プライベート フィールドではなくパブリック プロパティを使って型のオブジェクトにアクセスします。

警告を抑制する

古い API を使う必要がある場合は、コードまたはプロジェクト ファイルで警告を抑制することができます。

単一の違反だけを抑制するには、ソース ファイルにプリプロセッサ ディレクティブを追加して警告を無効にしてから、再度有効にします。

// Disable the warning.
#pragma warning disable SYSLIB0051

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0051

プロジェクトですべての SYSLIB0051 警告を抑制するには、プロジェクト ファイルに <NoWarn> プロパティを追加します。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0051</NoWarn>
  </PropertyGroup>
</Project>

詳細については、「警告を表示しない」を参照してください。

関連項目