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 spiegelungsbasierte 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 spiegelungsbasiert. 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 im Beispiel verwendeten Syntax 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# -Typeof-Operator 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 behandelt diesen Code automatisch.
Außerhalb des Konstruktors verwendetes "typeof"-Schlüsselwort
Wenn Sie einen Konstruktor dieser Serialisierungsklassen aufrufen und den C# -Typeofoperator außerhalb des Ausdrucks verwenden, der dem Parameter des Type Konstruktors bereitgestellt 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" />
Ebenso kann der .NET Native-Compiler diese Typen nicht auflösen, wenn Sie einen Konstruktor wie XmlSerializer(Type, Type[]) z. B. einen Konstruktor aufrufen, z. B. ein Array mit zusätzlichen Type Objekten zur Serialisierung bereitstellen.
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" />
Informationen zur im Beispiel verwendeten Syntax finden Sie unter Type-Element>.<