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.JSON-Deseralisierung zur abstrakten Liste mit DataContractJsonSerializer
In meinem Beispiel die entserialisierten Klasse ElementContainer genannt:
namespace Data
{
[DataContract]
[KnownType(typeof(ElementA))]
[KnownType(typeof(ElementB))]
public class ElementContainer
{
[DataMember]
public List<Element> Elements { get; set; }
}
[DataContract]
public abstract class Element
{
}
[DataContract]
public class ElementA : Element
{
[DataMember]
int Id { get; set; }
}
[DataContract]
public class ElementB : Element
{
[DataMember]
string Name { get; set; }
}
}
Dies ist die Json-Datei, die serialisierte war und dass ich deserialisieren versuchen. Beachten Sie das „__type“ Feld für den Deserializer der konkreten Klassen zu erstellen:
{
"Elements":
[
{
"__type":"ElementA:#Data",
"Id":1
},
{
"__type":"ElementB:#Data",
"Name":"MyName"
}
]
}
Im Folgenden ist der Code Ich verwende für die Deserialisierung:
public T LoadFromJSON<T>(string filePath)
{
try
{
using (FileStream stream = File.OpenRead(filePath))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
T contract = (T)serializer.ReadObject(stream);
return contract;
}
}
catch (System.Exception ex)
{
logger.Error("Cannot deserialize json " + filePath, ex);
throw;
}
}
Es ist möglich, die Deserialisierung Arbeit zu machen?
Danke!
Haben Sie versucht, den Typ der Liste zu ändern und zu sehen, was passiert? – leppie
Ich habe das versucht, aber es ändert nichts. – noon