Freigeben über


Serialisierung und Metadaten

Wenn Ihre App Objekte serialisiert und deserialisiert, müssen Sie möglicherweise Einträge zu Ihren Laufzeitdirektiven (.rd.xml) hinzufügen, um sicherzustellen, dass die erforderlichen Metadaten zur Laufzeit vorhanden sind. Es gibt zwei Kategorien von Serialisierern, und jede benötigt eine unterschiedliche Behandlung in der Datei für Laufzeitdirektiven.

  • Spiegelungsbasierte Serialisierer von Drittanbietern. Diese erfordern Änderungen an Ihrer Laufzeitdirektivendatei, und werden im nächsten Abschnitt erläutert.

  • Nicht reflektionsbasierte Serialisierer in der .NET Framework-Klassenbibliothek. Diese erfordern möglicherweise Änderungen an Ihrer Laufzeitanweisungsdatei und werden im Abschnitt Microsoft-Serialisierer erläutert.

Serialisierer von Drittanbietern

Serialisierer von Drittanbietern, einschließlich Newtonsoft.JSON, sind in der Regel spiegelungsbasiert. Angesichts eines binär großen Objekts (BLOB) serialisierter Daten werden die Felder in den Daten einem konkreten Typ zugewiesen, indem die Felder des Zieltyps anhand des Namens nachschlagen. Die Verwendung dieser Bibliotheken verursacht mindestens MissingMetadataException Ausnahmen für jedes Type-Objekt, das Sie in einer List<Type>-Auflistung serialisieren oder deserialisieren möchten.

Die einfachste Möglichkeit, Probleme zu beheben, die durch fehlende Metadaten für diese Serialisierer verursacht werden, besteht darin, Typen zu sammeln, die in der Serialisierung unter einem einzelnen Namespace (z. B. App.Models) verwendet werden und eine Serialize-Metadatendirektive darauf anwenden:

<Namespace Name="App.Models" Serialize="Required PublicAndInternal" />

Informationen zur im Beispiel verwendeten Syntax finden Sie unter <Namespace> Element.

Microsoft Serialisierer

Obwohl die DataContractSerializer-, DataContractJsonSerializer- und XmlSerializer-Klassen nicht auf Reflection angewiesen sind, muss Code basierend auf dem Objekt generiert werden, das serialisiert oder deserialisiert werden soll. Die überladenen Konstruktoren für jeden Serialisierer enthalten einen Type Parameter, der den Typ angibt, der serialisiert oder deserialisiert werden soll. Wie Sie diesen Typ in Ihrem Code angeben, definiert die aktion, die Sie ausführen müssen, wie in den nächsten beiden Abschnitten erläutert.

typeof, das im Konstruktor verwendet wird

Wenn Sie einen Konstruktor dieser Serialisierungsklassen aufrufen und den C#-Typof Operator in den Methodenaufruf einschließen, müssen Sie keine zusätzlichen Aufgabenausführen. Beispielsweise wird in jedem der folgenden Aufrufe eines Serialisierungsklassenkonstruktors das schlüsselwort typeof als Teil des Ausdrucks verwendet, der an den Konstruktor übergeben wird.

XmlSerializer xmlSer = new XmlSerializer(typeof(T));
DataContractSerializer dataSer = new DataContractSerializer(typeof(T));
DataContractJsonSerializer jsonSer = new DataContractJsonSerializer(typeof(T));

Der .NET Native-Compiler behandelt diesen Code automatisch.

Die Verwendung von "typeof" außerhalb des Konstruktors

Wenn Sie einen Konstruktor dieser Serialisierungsklassen aufrufen und den C#-typeof-Operator außerhalb des Ausdrucks verwenden, der dem Type-Parameter des Konstruktors übergeben wird, wie im folgenden Beispielcode, kann der .NET Native Compiler den Typ nicht auflösen.

Type t = typeof(DataSet);
XmlSerializer ser = new XmlSerializer(t);

In diesem Fall müssen Sie den Typ in der Laufzeitrichtliniendatei angeben, indem Sie einen Eintrag hinzufügen, der wie folgt aussieht:

<Type Name="DataSet" Browse="Required Public" />

Wenn Sie einen Konstruktor wie XmlSerializer(Type, Type[]) aufrufen und ein Array zusätzlicher Type-Objekte übergeben, die serialisiert werden sollen, wie im folgenden Code, kann der .NET Native-Compiler diese Typen nicht auflösen.

XmlSerializer xSerializer = new XmlSerializer(typeof(Teacher),
                            new Type[] { typeof(Student),
                                         typeof(Course),
                                         typeof(Location) });

Fügen Sie der Laufzeitdirektivendatei Einträge hinzu, z. B. folgendes für jeden Typ:

<Type Name="t" Browse="Required Public" />

Unter <Typ> Elementfinden Sie Informationen zur im Beispiel verwendeten Syntax.

Siehe auch