SYSLIB0050: Serialisasi berbasis formatter sudah usang
API berikut usang, mulai dari .NET 8. Memanggilnya dalam kode menghasilkan peringatan SYSLIB0050
pada waktu kompilasi.
- 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)
Solusi Sementara
Jika Anda menggunakan FormatterServices.GetUninitializedObject(Type), gunakan RuntimeHelpers.GetUninitializedObject(Type) sebagai gantinya.
Jika Anda mengompilasi silang untuk .NET Framework dan .NET modern, Anda dapat menggunakan
#if
pernyataan untuk secara selektif memanggil API yang sesuai, seperti yang ditunjukkan dalam cuplikan berikut.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
Jika Anda menulis pustaka serialisasi, kami sangat menyarankan untuk melawan pustaka serialisasi yang mendukung infrastruktur serialisasi warisan (
[Serializable]
danISerializable
). Pustaka serialisasi modern harus memiliki kebijakan berdasarkan API publik jenis daripada detail implementasi privatnya. Jika Anda mendasarkan serializer pada detail implementasi ini dan sangat mengikatnya keISerializable
dan mekanisme lain yang mendorong penyematan nama jenis dalam payload serial, itu dapat menyebabkan masalah yang dijelaskan dalam Risiko deserialisasi dalam penggunaan BinaryFormatter dan jenis terkait.Jika pustaka serialisasi Anda harus tetap kompatibel dengan infrastruktur serialisasi warisan, Anda dapat dengan mudah menekan kelalaian API serialisasi warisan.
Menyembunyikan peringatan
Jika Anda harus menggunakan API usang, Anda dapat menekan peringatan dalam kode atau dalam file proyek Anda.
Untuk menekan hanya satu pelanggaran, tambahkan direktif praprosedur ke file sumber Anda untuk menonaktifkan lalu mengaktifkan kembali peringatan.
// Disable the warning.
#pragma warning disable SYSLIB0050
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0050
Untuk menekan semua SYSLIB0050
peringatan dalam proyek Anda, tambahkan <NoWarn>
properti ke file proyek Anda.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
</PropertyGroup>
</Project>
Untuk informasi selengkapnya, lihat Menyembunyikan peringatan.