J'essaye de désérialiser un fichier JSon à une instance d'une classe qui contient une liste abstraite. Sérialiser l'instance au Json fonctionne bien (vérifiez le fichier json ci-dessous). Lors de la désérialisation, j'obtiens une "System.MemberAccessException" avec le message "Impossible de créer une classe abstraite". Obvisouly le deseralizer essaye d'instancier la classe abstraite et pas la classe concrète.Désertion de JSON à la liste abstraite en utilisant DataContractJsonSerializer
Dans mon exemple, la classe désérialisé est appelée 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; }
}
}
Ceci est le fichier JSON qui a été sérialisé et que je suis en train de désérialiser. Remarquez le champ « __type » pour le désérialiseur pour créer les classes concrètes:
{
"Elements":
[
{
"__type":"ElementA:#Data",
"Id":1
},
{
"__type":"ElementB:#Data",
"Name":"MyName"
}
]
}
Ce qui suit est le code que je utilise pour désérialisation:
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;
}
}
Il est possible de faire le travail de désérialisation?
Merci!
Avez-vous essayé de modifier le type de la liste à objet et de voir ce qui se passe? – leppie
J'ai essayé ça mais ça ne change rien. – noon