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 の 1 つを直接呼び出します。
-
SYSLIB0011
警告コードがまだ抑制されていません。
導入されたバージョン
.NET 7
破壊的変更の種類
この変更は ソースの互換性に影響を与える可能性があります。
変更の理由
BinaryFormatter の長期的な非推奨計画の一環として、我々は引き続きライブラリからBinaryFormatter
機能を削減し、開発者がこの型から移行できるように促しています。
推奨されるアクション
最善の措置は、セキュリティと信頼性の欠陥のために BinaryFormatter
から移行することです。
BinaryFormatter
は、将来のリリースで .NET から削除される可能性があります。 .NET ライブラリ チームは、 System.Half や System.DateOnly などの最近の型が BinaryFormatter
と互換性がないという姿勢を既に取っています。
エラーを抑制する必要がある場合は、元の廃止に関する記事のガイドラインに従って行うことができます。 (.NET 5/6 の動作に一致するように) エラーを警告に変換するプロジェクト プロパティを設定することで、プロジェクト全体でエラーを無効にすることもできます。
Warnung
このプロパティを設定すると、ホストの動作が変わる可能性があります。 <EnableUnsafeBinaryFormatterSerialization> プロパティを参照してください。
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
注
"エラーとして警告" を有効にしてプロジェクトをコンパイルしても、コンパイルは失敗します。 (これは、.NET 5 および .NET 6 SDK に付属している動作と一致します)。その場合でも、ソースまたはプロジェクト ファイルのSYSLIB0011
要素で<NoWarn>
警告を抑制する必要があります。
<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ランタイム ポリシーは、アプリ ホストによって制御されます。
BinaryFormatter
がライブラリのプロジェクト ファイル内で<EnableUnsafeBinaryFormatterSerialization>
に設定されている場合でも、true
の呼び出しは実行時に失敗する可能性があります。 ライブラリは、アプリ ホストのランタイム ポリシーをオーバーライドできません。
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