我試圖將JSon文件反序列化爲包含抽象列表的類的實例。將實例序列化到Json效果很好(請查看下面的json文件)。當反序列化時,我得到一個「System.MemberAccessException」消息「無法創建抽象類」。可以想象的是,deseralizer正試圖實例化抽象類而不是具體類。使用DataContractJsonSerializer對抽象列表JSON去串聯
在我的例子反序列化的類被稱爲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; }
}
}
這是連載的JSON文件和我試圖反序列化。請注意「__type」字段解串器來創建具體類:
{
"Elements":
[
{
"__type":"ElementA:#Data",
"Id":1
},
{
"__type":"ElementB:#Data",
"Name":"MyName"
}
]
}
是代碼我使用的反序列化下列內容:
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;
}
}
有可能使反序列化工作?
謝謝!
您是否嘗試將列表的類型更改爲對象並查看發生了什麼? – leppie 2010-10-19 18:13:56
我試過了,但它沒有改變任何東西。 – noon 2010-10-19 18:55:44