Próbuję deserializować plik JSon do instancji klasy zawierającej listę abstrakcyjną. Serializacja instancji do Json działa dobrze (sprawdź plik json poniżej). Podczas deserializacji otrzymuję "System.MemberAccessException" z komunikatem "Nie można utworzyć klasy abstrakcyjnej". Obvisouly dealizator próbuje stworzyć klasę abstrakcyjną, a nie konkretną klasę.Dezercja JSON do listy abstrakcyjnej przy użyciu DataContractJsonSerializer
W moim przykładzie postaci innej niż serializowana klasa nazywa 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; }
}
}
Jest to plik JSON, który był w odcinkach i że próbuję deserializowania. Zwróć uwagę na „pole” __type dla Deserializatora do stworzenia klasy betonu:
{
"Elements":
[
{
"__type":"ElementA:#Data",
"Id":1
},
{
"__type":"ElementB:#Data",
"Name":"MyName"
}
]
}
Poniżej znajduje się kod używam dla deserializacji:
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;
}
}
Jest możliwe, aby prace deserializacjia?
Dzięki!
Czy próbowałeś zmienić typ listy na obiekt i zobaczyć, co się dzieje? – leppie
Próbowałem, ale to nic nie zmienia. – noon