共用方式為


SYSLIB0050:格式器型序列化已淘汰

從 .NET 8 開始,下列 API 已淘汰。 在程式碼中呼叫這些方法會導致在編譯時間產生警告 SYSLIB0050

因應措施

  • 若您使用的是 FormatterServices.GetUninitializedObject(Type),請改為使用 RuntimeHelpers.GetUninitializedObject(Type)

    如果您針對 .NET Framework 和新式 .NET 進行交叉編譯,則可以使用 #if 陳述式選擇性地呼叫適當的 API,如下列程式碼片段所示。

    Type typeToInstantiate;
    #if NET5_0_OR_GREATER
    object obj = System.Runtime.CompilerServices.RuntimeHelpers.GetUninitializedObject(typeToInstantiate);
    #else
    object obj = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeToInstantiate);
    #endif
    
  • 如果您要撰寫序列化程式庫,強烈建議您針對支援舊版序列化基礎結構 ([Serializable]ISerializable) 的序列化程式庫。 新式序列化程式庫應根據類型的公用 API 而非其私人實作詳細資料來設定原則。 如果您根據這些實作詳細資料建立序列化程式,並將其緊密繫結至 ISerializable,以及鼓勵在序列化承載中內嵌型別名稱的其他機制,可能會導致使用 BinaryFormatter 和相關類型時還原序列化風險中所述的問題。

    如果您的序列化程式庫必須與舊版序列化基礎結構保持相容,則可以輕鬆地隱藏舊版序列化 API 淘汰。

隱藏警告

若您必須使用已淘汰的 API,您可以在程式碼或專案檔中隱藏警告。

若要只隱藏單一違規,請將前置處理器指示詞新增至原始程式碼檔案,以停用並重新啟用警告。

// Disable the warning.
#pragma warning disable SYSLIB0050

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

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

若要隱藏專案中的所有 SYSLIB0050 警告,請將 <NoWarn> 屬性新增至專案檔。

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

如需詳細資訊,請參閱隱藏警告

另請參閱