Ermitteln, ob ein .NET Standard Objekt serialisierbar istHow to determine if a .NET Standard object is serializable

Der .NET Standard ist eine Spezifikation, die die Typen und Member definiert, die für bestimmte .net-Implementierungen vorhanden sein müssen, die dieser Version des Standards entsprechen.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. Der .NET Standard definiert jedoch nicht, ob ein Typ serialisierbar ist.However, the .NET Standard does not define whether a type is serializable. Die in der .NET Standard-Bibliothek definierten Typen sind nicht mit dem SerializableAttribute-Attribut gekennzeichnet.The types defined in the .NET Standard Library are not marked with the SerializableAttribute attribute. Stattdessen können bestimmte .net-Implementierungen, wie z. b. die .NET Framework und .net Core, feststellen, ob ein bestimmter Typ serialisierbar ist.Instead, specific .NET implementations, such as the .NET Framework and .NET Core, are free to determine whether a particular type is serializable.

Wenn Sie eine Bibliothek entwickelt haben, die die .NET Standard als Ziel hat, kann die Bibliothek von jeder .NET-Implementierung genutzt werden, die die .NET Standard unterstützt.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. Dies bedeutet, dass Sie nicht im Voraus wissen können, ob ein bestimmter Typ serialisierbar ist. Sie können nur bestimmen, ob es zur Laufzeit serialisierbar ist.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.

Sie können bestimmen, ob ein Objekt zur Laufzeit serialisierbar ist, indem Sie den Wert der IsSerializable-Eigenschaft eines Type Objekts abrufen, das den Typ dieses Objekts darstellt.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. Im folgenden Beispiel wird eine-Implementierung bereitstellt.The following example provides one implementation. Es definiert eine IsSerializable(Object) Erweiterungsmethode, die angibt, ob eine beliebige Object Instanz serialisiert werden kann.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(ByVal 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

Anschließend können Sie ein beliebiges-Objekt an die-Methode übergeben, um zu bestimmen, ob es in der aktuellen .NET-Implementierung serialisiert und deserialisiert werden kann, wie im folgenden Beispiel gezeigt: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)

Siehe auchSee also