SYSLIB0051: APIs de suporte à serialização herdada estão obsoletas
Os seguintes tipos de APIs são obsoletos, começando no .NET 8. Chamá-los em código gera aviso SYSLIB0051
em tempo de compilação.
- Todos os construtores de serialização públicos ou protegidos que seguem o padrão
.ctor(SerializationInfo, StreamingContext)
. Um exemplo de tal construtor é Exception(SerializationInfo, StreamingContext). - Todas as implementações implícitas do ISerializable.GetObjectData(SerializationInfo, StreamingContext) método, por exemplo, System.Exception.GetObjectData(SerializationInfo, StreamingContext).
- Todas as implementações implícitas do IObjectReference.GetRealObject(StreamingContext) método, por exemplo, System.Reflection.ParameterInfo.GetRealObject(StreamingContext).
Para obter uma lista completa das APIs afetadas, consulte APIs obsoletas - SYSLIB0051.
Solução
Se você criou um tipo personalizado derivado do System.Exception, considere se realmente precisa que ele seja serializável. É provável que você não precise que ele seja serializável, já que a serialização de exceção destina-se principalmente a oferecer suporte remoto e o suporte para comunicação remota foi descartado no .NET Core 1.0.
Se o tipo de exceção personalizada for definido como o mostrado no trecho de código a seguir, basta remover o
[Serializable]
atributo, o construtor de serialização e a substituição do GetObjectData(SerializationInfo, StreamingContext) método.[Serializable] // Remove this attribute. public class MyException : Exception { public MyException() { } public MyException(string message) : base(message) { } public MyException(string message, Exception inner) : base(message, inner) { } // Remove this constructor. protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // ... } // Remove this method. public override void GetObjectData(SerializationInfo info, StreamingContext context) { // ... base.GetObjectData(info, context); } }
Pode haver casos em que você não possa remover essas APIs do seu tipo de exceção personalizado, por exemplo, se você produzir uma biblioteca restrita por requisitos de compatibilidade de API. Nesse caso, a recomendação é obsoletar seu próprio construtor de serialização e
GetObjectData
métodos usando oSYSLIB0051
código de diagnóstico, conforme mostrado no código a seguir. Como idealmente ninguém fora da própria infraestrutura de serialização deve chamar essas APIs, a obsolação deve afetar apenas outros tipos que subclassifiquem seu tipo de exceção personalizado. Ele não deve afetar viralmente ninguém capturando, construindo ou usando seu tipo de exceção personalizado.[Serializable] public class MyException : Exception { public MyException() { } public MyException(string message) : base(message) { } public MyException(string message, Exception inner) : base(message, inner) { } [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to the serialization ctor. protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // ... } [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to GetObjectData. public override void GetObjectData(SerializationInfo info, StreamingContext context) { // ... base.GetObjectData(info, context); } }
Se você cruzar o destino para .NET Framework e .NET 8+, você pode usar uma
#if
instrução para aplicar a obsolescência condicionalmente. Essa é a mesma estratégia que a equipe do .NET usa na base de código das bibliotecas do .NET quando os tempos de execução de direcionamento cruzado.[Serializable] public class MyException : Exception { // ... #if NET8_0_OR_GREATER [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to the serialization ctor #endif protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // ... } #if NET8_0_OR_GREATER [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to GetObjectData #endif public override void GetObjectData(SerializationInfo info, StreamingContext context) { // ... base.GetObjectData(info, context); } }
Se você declarou um tipo que subclassifica um tipo .NET atribuído
[Serializable]
e está recebendoSYSLIB0051
avisos, siga as orientações para tipos de exceção personalizados no marcador anterior.
Gorjeta
Se o seu [Serializable]
tipo personalizado não subclassificar um tipo .NET, você não verá SYSLIB0051
avisos. No entanto, recomendamos não anotar seu tipo dessa maneira, pois as bibliotecas de serialização modernas não System.Text.Json
as exigem. Considere remover o [Serializable]
atributo e a ISerializable
interface. Em vez disso, confie em sua biblioteca de serialização para acessar objetos do tipo por meio de suas propriedades públicas em vez de seus campos privados.
Suprimir um aviso
Se você precisar usar as APIs obsoletas, poderá suprimir o aviso no código ou no arquivo de projeto.
Para suprimir apenas uma única violação, adicione diretivas de pré-processador ao arquivo de origem para desativar e reativar o aviso.
// Disable the warning.
#pragma warning disable SYSLIB0051
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0051
Para suprimir todos os SYSLIB0051
avisos em seu projeto, adicione uma <NoWarn>
propriedade ao seu arquivo de projeto.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0051</NoWarn>
</PropertyGroup>
</Project>
Para obter mais informações, consulte Suprimir avisos.