【发布时间】:2011-04-27 15:24:50
【问题描述】:
我正在尝试将 JSon 文件反序列化为包含抽象列表的类的实例。将实例序列化为 Json 效果很好(检查下面的 json 文件)。反序列化时,我收到带有消息“无法创建抽象类”的“System.MemberAccessException”。显然解串器正在尝试实例化抽象类而不是具体类。
在我的示例中,反序列化的类称为 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;
}
}
是否可以使反序列化工作?
谢谢!
【问题讨论】:
-
您是否尝试过将列表的类型更改为对象并查看发生了什么?
-
我试过了,但没有任何改变。
标签: c# json list serialization abstract