BinaryFormatter シリアル化 API でコンパイラ エラーが生成される
BinaryFormatter の長期的な非推奨計画の一環として、ライブラリから BinaryFormatter
機能を引き続きカリングし、開発者をその型から引き離します。 .NET 7 以降では、次の API を呼び出すと、すべての C# および Visual Basic プロジェクトの種類でコンパイル時エラーが生成されます。
- System.Exception.SerializeObjectState イベント
- BinaryFormatter.Serialize メソッド
- BinaryFormatter.Deserialize メソッド
- Formatter.Serialize(Stream, Object) メソッド
- Formatter.Deserialize(Stream) メソッド
- IFormatter.Serialize(Stream, Object) メソッド
- IFormatter.Deserialize(Stream) メソッド
以前の動作
.NET 5 以降では、影響を受ける Serialize
および Deserialize
メソッドを使用すると、ID が SYSLIB0011
のコンパイラ ''警告'' が生成されました。 詳細については、「BinaryFormatter シリアル化メソッドが古い形式になり、ASP.NET アプリでは使用不可に (.NET 5)」を参照してください。
Exception.SerializeObjectState イベントを使用した場合、エラーは生成されませんでした。
新しい動作
.NET 7 以降では、影響を受ける API のいずれかをコードで使用すると、同じ ID (SYSLIB0011
) のコンパイラ ''エラー'' が生成されます。 プロジェクトが次のすべての条件を満たしている場合、影響を受けます。
- C# または Visual Basic プロジェクトである。
net7.0
以上を対象としている。- 影響を受ける API のいずれかを直接呼び出している。
SYSLIB0011
警告コードがまだ抑制されていない。
導入されたバージョン
.NET 7
破壊的変更の種類
この変更はソースの互換性に影響を与える可能性があります。
変更理由
BinaryFormatter の長期的な非推奨計画の一環として、ライブラリから BinaryFormatter
機能を引き続きカリングし、開発者をその型から引き離します。
推奨アクション
最善策は、セキュリティと信頼性に欠陥があるため BinaryFormatter
から移行することです。 BinaryFormatter
は、将来のリリースで .NET から削除される可能性があります。 .NET ライブラリ チームは既に、System.Half や System.DateOnly などの最近の型が BinaryFormatter
と互換性がないというスタンスを取っています。
エラーを抑制する必要がある場合は、元の古い形式に関する記事のガイドラインに従って行うことができます。 (.NET 5/6 の動作と一致するように) エラーを警告に変換するプロジェクト プロパティを設定することで、プロジェクト全体でエラーを無効にすることもできます。
警告
このプロパティを設定すると、ホストの動作が変わる可能性があります。 「<EnableUnsafeBinaryFormatterSerialization> プロパティ」を参照してください。
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
注意
"エラーとして警告" を有効にしてプロジェクトをコンパイルしても、コンパイルは失敗します (これは、.NET 5 および .NET 6 SDK に付属している動作と一致します)。その場合でも、ソースまたはプロジェクト ファイルの <NoWarn>
要素で SYSLIB0011
警告を抑制する必要があります。
<EnableUnsafeBinaryFormatterSerialization> プロパティ
<EnableUnsafeBinaryFormatterSerialization
プロパティは.NET 5 で導入されました。 .NET 7 では、このスイッチの動作が変更され、''コンパイルとホストの両方の'' 実行時の動作が制御されます。 このスイッチの意味は、次の表に示すように、プロジェクトの種類によって異なります。
プロジェクトの種類 | プロパティが true に設定されている場合 |
プロパティが false に設定されている場合 |
プロパティが省略されている場合 |
---|---|---|---|
ライブラリ/共有コンポーネント1 | 影響を受ける API は古いものであり、警告が示されます。 アプリケーションに対して "エラーとしての警告" が有効になっているか、SYSLIB0011 警告コードを抑制していない限り、コンパイルは成功します。 |
影響を受ける API は古いものであり、エラーが示され、コードからそれらの API への呼び出しは、エラーが抑制されない限りコンパイル時に失敗します。 | (false の場合と同じ。) |
Blazor および MAUI アプリ2 | BinaryFormatter の呼び出しは実行時に失敗します。 |
BinaryFormatter の呼び出しは実行時に失敗します。 |
BinaryFormatter の呼び出しは実行時に失敗します。 |
ASP.NET アプリ | 影響を受ける API は古いものであり、警告が示されます。 アプリケーションに対して "エラーとしての警告" が有効になっているか、SYSLIB0011 警告コードを抑制していない限り、コンパイルは成功します。 呼び出し元がコードであるか、使用した依存関係であるかに関係なく、ランタイムでは BinaryFormatter の呼び出しが ''許可'' されます。 |
影響を受ける API は古いものであり、エラーが示され、コードからそれらの API への呼び出しは、エラーが抑制されない限りコンパイル時に失敗します。 呼び出し元がコードであるか、使用した依存関係であるかに関係なく、ランタイムでは BinaryFormatter の呼び出しが ''禁止'' されます。 |
(false の場合と同じ。) |
デスクトップ アプリとその他のすべてのアプリの種類 | 影響を受ける API は古いものであり、警告が示されます。 アプリケーションに対して "エラーとしての警告" が有効になっているか、SYSLIB0011 警告コードを抑制していない限り、コンパイルは成功します。 呼び出し元がコードであるか、使用した依存関係であるかに関係なく、ランタイムでは BinaryFormatter の呼び出しが ''許可'' されます。 |
影響を受ける API は古いものであり、エラーが示され、コードからそれらの API への呼び出しは、エラーが抑制されない限りコンパイル時に失敗します。 呼び出し元がコードであるか、使用した依存関係であるかに関係なく、ランタイムでは BinaryFormatter の呼び出しが ''禁止'' されます。 |
影響を受ける API は古いものであり、エラーが示され、コードからそれらの API への呼び出しは、エラーが抑制されない限りコンパイル時に失敗します。 呼び出し元がコードであるか、使用した依存関係であるかに関係なく、ランタイムでは BinaryFormatter の呼び出しが ''許可'' されます。 |
1ランタイム ポリシーはアプリ ホストによって制御されます。 <EnableUnsafeBinaryFormatterSerialization>
がライブラリのプロジェクト ファイル内で true
に設定されている場合でも、BinaryFormatter
の呼び出しは実行時に失敗する可能性があります。 ライブラリでアプリ ホストのランタイム ポリシーをオーバーライドすることはできません。
2Blazor および MAUI ランタイムでは、BinaryFormatter
の呼び出しが禁止されています。 <EnableUnsafeBinaryFormatterSerialization>
に設定した値に関係なく、呼び出しは実行時に失敗します。 Blazor または MAUI アプリケーションから、あるいは Blazor または MAUI アプリで使用されることを意図したライブラリから、これらの API を呼び出さないでください。
影響を受ける API
- System.Exception.SerializeObjectState
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
- System.Runtime.Serialization.Formatter.Serialize(Stream, Object)
- System.Runtime.Serialization.Formatter.Deserialize(Stream)
- System.Runtime.Serialization.IFormatter.Serialize(Stream, Object)
- System.Runtime.Serialization.IFormatter.Deserialize(Stream)
こちらもご覧ください
.NET