SYSLIB0050:格式器型序列化已淘汰
從 .NET 8 開始,下列 API 已淘汰。 在程式碼中呼叫這些方法會導致在編譯時間產生警告 SYSLIB0050
。
- System.Runtime.Serialization.FormatterConverter
- System.Runtime.Serialization.FormatterServices
- System.Runtime.Serialization.IFormatterConverter
- System.Runtime.Serialization.IObjectReference
- System.Runtime.Serialization.ISafeSerializationData
- System.Runtime.Serialization.ISerializationSurrogate
- System.Runtime.Serialization.ISurrogateSelector
- System.Runtime.Serialization.ObjectIDGenerator
- System.Runtime.Serialization.ObjectManager
- System.Runtime.Serialization.SafeSerializationEventArgs
- System.Runtime.Serialization.SerializationObjectManager
- System.Runtime.Serialization.StreamingContextStates
- System.Runtime.Serialization.SurrogateSelector
- System.Runtime.Serialization.Formatters.FormatterAssemblyStyle
- System.Runtime.Serialization.Formatters.FormatterTypeStyle
- System.Runtime.Serialization.Formatters.IFieldInfo
- System.Runtime.Serialization.Formatters.TypeFilterLevel
- System.Type.IsSerializable
- System.Reflection.FieldAttributes.NotSerialized
- System.Reflection.FieldInfo.IsNotSerialized
- System.Reflection.TypeAttributes.Serializable
- System.Runtime.Serialization.ISerializable.GetObjectData(SerializationInfo, StreamingContext)
- SerializationInfo(Type, IFormatterConverter, Boolean)
- SerializationInfo(Type, IFormatterConverter)
- StreamingContext(StreamingContextStates, Object)
- StreamingContext(StreamingContextStates)
因應措施
若您使用的是 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>
如需詳細資訊,請參閱隱藏警告。