Share via


Serialisierung und Metadaten

Wenn Ihre Anwendung Objekte serialisiert und deserialisiert, müssen Sie möglicherweise Einträge zur Laufzeitanweisungsdatei (.rd.xml) hinzufügen, um sicherzustellen, dass die erforderlichen Metadaten zur Laufzeit vorhanden sind. Es gibt zwei Kategorien von Serialisierungsprogrammen, und jedes erfordert eine andere Behandlung in der Laufzeitdirektivendatei:

  • Reflektionsbasierte Drittanbieter-Serialisierungsprogramme. Diese erfordern Änderungen an der Laufzeitdirektivendatei und werden im nächsten Abschnitt erläutert.

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

Drittanbieter-Serialisierungsprogramme

Serialisierer von Drittanbietern, einschließlich Newtonsoft.JSON, sind in der Regel reflektionsbasiert. Bei einem BLOB aus serialisierten Daten werden die Felder in den Daten einem konkreten Typ durch Suchen der Felder des Zieltyps nach dem Namen zugewiesen. Durch das Verwenden dieser Bibliotheken werden mindestens MissingMetadataException-Ausnahmen für alle Type-Objekte verursacht, die Sie in einer List<Type>-Auflistung serialisieren oder deserialisieren möchten.

Durch fehlende Metadaten für diese Serialisierungsprogramme verursachte Probleme können am einfachsten gelöst werden, indem Sie Typen auflisten, die bei der Serialisierung unter einem einzigen Namespace verwendet werden (z. B. App.Models) und eine Serialize-Metadatenanweisung darauf anwenden:

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

Informationen zur syntax, die im Beispiel verwendet wird, finden Sie unter <Namespace-Element>.

Microsoft-Serialisierungsprogramme

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

Im Konstruktor verwendetes "typeof"-Schlüsselwort

Wenn Sie einen Konstruktor dieser Serialisierungsklassen aufrufen und den C#- Operator typeof in den Methodenaufruf einschließen, müssen Sie keine zusätzlichen Aufgaben ausführen. In jedem der folgenden Aufrufe eines Serialisierungsklassenkonstruktors wird z. B. das typeof-Schlüsselwort 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 verarbeitet diesen Code automatisch.

Außerhalb des Konstruktors verwendetes "typeof"-Schlüsselwort

Wenn Sie einen Konstruktor dieser Serialisierungsklassen aufrufen und den C#-Operator typeof außerhalb des Ausdrucks verwenden, der für den Parameter des Type Konstruktors angegeben wird, wie im folgenden Code, 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 Laufzeitanweisungsdatei angeben, indem Sie einen Eintrag wie den folgenden hinzufügen:

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

Wenn Sie einen Konstruktor aufrufen, zXmlSerializer(Type, Type[]). B. und ein Array zusätzlicher zu serialisierender Type Objekte bereitstellen, 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 wie die folgenden für jeden Typ hinzu:

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

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

Siehe auch