Sto tentando di deserializzare un file JSon in un'istanza di una classe che contiene un elenco astratto. La serializzazione dell'istanza su Json funziona bene (controlla il file json qui sotto). Durante la deserializzazione viene visualizzata una "System.MemberAccessException" con il messaggio "Impossibile creare una classe astratta". Obvisouly il desalizzatore sta tentando di istanziare la classe astratta e non la classe concreta.Deseralizzazione JSON per l'elenco astratto utilizzando DataContractJsonSerializer
Nel mio esempio la classe deserializzato si chiama ElementContainer:
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; }
}
}
Questo è il file JSON che era serializzato e che sto cercando di deserializzare. Notate il campo "__type" per il deserializzatore per creare le classi concrete:
{
"Elements":
[
{
"__type":"ElementA:#Data",
"Id":1
},
{
"__type":"ElementB:#Data",
"Name":"MyName"
}
]
}
Il seguente è il codice che sto utilizzando per deserializzazione:
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;
}
}
E 'possibile far funzionare il deserializzazione?
Grazie!
Hai provato a cambiare il tipo di elenco da obiettare e vedere cosa sta succedendo? – leppie
L'ho provato ma non cambia nulla. – noon