JSON-Deseralisierung zur abstrakten Liste mit DataContractJsonSerializer

8

Ich versuche eine JSon-Datei zu einer Instanz einer Klasse zu deserialisieren, die eine abstrakte Liste enthält. Serialisieren der Instanz in den Json funktioniert gut (überprüfen Sie die JSON-Datei unten). Beim Deserialisieren bekomme ich eine "System.MemberAccessException" mit der Meldung "Kann keine abstrakte Klasse erstellen". Offensichtlich versucht der Deseralizer die abstrakte Klasse und nicht die konkrete Klasse zu instantiieren.

In meinem Beispiel heißt die deserialisierte Klasse ElementContainer:

%Vor%

Dies ist die JSON-Datei, die serialisiert wurde und die ich deserialisieren möchte. Beachten Sie das Feld "__type" für den Deserializer, um die konkreten Klassen zu erstellen:

%Vor%

Folgendes ist der Code, den ich für die Deserialisierung verwende:

%Vor%

Es ist möglich, die Deserialisierung durchzuführen?

Danke!

    
noon 19.10.2010, 18:04
quelle

1 Antwort

10

Wir haben herausgefunden, warum es nicht funktioniert hat. Kurz nach der Serialisierung des Objekts haben wir die resultierende Zeichenfolge für mehr Lesbarkeit identifiziert. Dann schreiben wir die Zeichenfolge in eine Datei:

%Vor%

Die Identität ist eigentlich der Grund, warum die Deserialisierung nicht funktioniert hat. Es scheint, dass der Parser des DataContractJsonSerializers wirklich wählerisch ist. Wenn sich einige Zeichen zwischen dem Zeichen {und dem Feld "__type" befinden, geht der Serializer verloren.

Diese Zeichenfolge wird beispielsweise korrekt serialisiert:

%Vor%

Aber dieser nächste String wird nicht serialisiert.

%Vor%

Der einzige Unterschied sind die Leerzeichen vor dem "__type". Die Serialisierung löst eine MemberAccessException aus. Dies ist irreführend, da dieses Verhalten nur beim Deserialisieren in eine abstrakte Liste angezeigt wird. Serialisierung in ein abstraktes Feld funktioniert einwandfrei, unabhängig von den Zeichen.

Um dieses Problem zu beheben, ohne die Lesbarkeit der Datei zu entfernen, kann die Zeichenfolge vor der Deseralisierung geändert werden. Zum Beispiel:

%Vor%     
noon 19.10.2010 22:59
quelle

Tags und Links