Cómo determinar si un objeto .NET Standard es serializableHow to determine if a .NET Standard object is serializable

El .NET Standard es una especificación que define los tipos y miembros que deben estar presentes en implementaciones de .NET específicas que se ajusten a esa versión del estándar.The .NET Standard is a specification that defines the types and members that must be present on specific .NET implementations that conform to that version of the standard. Sin embargo, el .NET Standard no define si un tipo es serializable.However, the .NET Standard does not define whether a type is serializable. Los tipos definidos en la biblioteca .NET Standard no están marcados con el atributo SerializableAttribute.The types defined in the .NET Standard Library are not marked with the SerializableAttribute attribute. En su lugar, las implementaciones de .NET específicas, como la .NET Framework y .NET Core, son gratuitas para determinar si un tipo determinado es serializable.Instead, specific .NET implementations, such as the .NET Framework and .NET Core, are free to determine whether a particular type is serializable.

Si ha desarrollado una biblioteca que tiene como destino el .NET Standard, la biblioteca puede utilizarla cualquier implementación de .NET que admita la .NET Standard.If you've developed a library that targets the .NET Standard, your library can be consumed by any .NET implementation that supports the .NET Standard. Esto significa que no puede saber de antemano si un tipo determinado es serializable; solo puede determinar si es serializable en tiempo de ejecución.This means that you cannot know in advance whether a particular type is serializable; you can only determine whether it is serializable at run time.

Puede determinar si un objeto es serializable en tiempo de ejecución recuperando el valor de la propiedad IsSerializable de un objeto Type que representa el tipo de ese objeto.You can determine whether an object is serializable at runtime by retrieving the value of the IsSerializable property of a Type object that represents that object's type. En el ejemplo siguiente se proporciona una implementación de.The following example provides one implementation. Define un método de extensión IsSerializable(Object) que indica si se puede serializar cualquier instancia de Object.It defines an IsSerializable(Object) extension method that indicates whether any Object instance can be serialized.

namespace Libraries
{
    using System;
    
    public static class UtilityLibrary
    {
        public static bool IsSerializable(this object obj)
        {
            if (obj == null) 
                return false;

            Type t = obj.GetType();
            return t.IsSerializable;
        }
    }
}
Imports System.Runtime.CompilerServices

Namespace Global.Libraries

    Public Module UtilityLibrary
        <Extension>
        Public Function IsSerializable(obj As Object) As Boolean
            If obj Is Nothing Then Return False 

            Dim t As Type = obj.GetType()
            Return t.IsSerializable
        End Function
    End Module
End Namespace

Después, puede pasar cualquier objeto al método para determinar si se puede serializar y deserializar en la implementación actual de .NET, como se muestra en el ejemplo siguiente:You can then pass any object to the method to determine whether it can be serialized and deserialized on the current .NET implementation, as the following example shows:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using Libraries;

namespace test_serialization
{
   class Program
   {
      static void Main()
      {
         var value = ValueTuple.Create("03244562", DateTime.Now, 13452.50m);
         if (value.IsSerializable())
         {
            // Serialize the value tuple.
            var formatter = new BinaryFormatter();
            using (var stream = new FileStream("data.bin", FileMode.Create, 
                                        FileAccess.Write, FileShare.None))
            {                            
               formatter.Serialize(stream, value);
            }
            // Deserialize the value tuple.
            using (var readStream = new FileStream("data.bin", FileMode.Open))
            {
               object restoredValue = formatter.Deserialize(readStream);
               Console.WriteLine($"{restoredValue.GetType().Name}: {restoredValue}");
            }   
         }
         else
         {
            Console.WriteLine($"{nameof(value)} is not serializable");
         }
      }
   }
}
// The example displays output like the following:
//    ValueTuple`3: (03244562, 10/18/2017 5:25:22 PM, 13452.50)
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports Libraries

Module Program
    Sub Main()
        Dim value = ValueTuple.Create("03244562", DateTime.Now, 13452.50d)
        If value.IsSerializable() Then
            Dim formatter As New BinaryFormatter()
            ' Serialize the value tuple.
            Using stream As New FileStream("data.bin", FileMode.Create, 
                                           FileAccess.Write, FileShare.None)
                formatter.Serialize(stream, value)
            End Using
            ' Deserialize the value tuple.
            Using readStream As New FileStream("data.bin", FileMode.Open)
                Dim restoredValue = formatter.Deserialize(readStream)
                Console.WriteLine($"{restoredValue.GetType().Name}: {restoredValue}")
            End Using
        Else
            Console.WriteLine($"{nameof(value)} is not serializable")
        End If
    End Sub
End Module
' The example displays output like the following:
'    ValueTuple`3: (03244562, 10/18/2017 5:25:22 PM, 13452.50)

Vea tambiénSee also