【发布时间】:2011-10-29 00:37:58
【问题描述】:
我遇到了涉及多态对象数组的 JSON 反序列化问题。我已经尝试过记录在here 和here 的序列化解决方案,它们非常适合序列化,但都在反序列化时崩溃了。
我的班级结构如下:
可识别
[DataContract(IsReference=true)]
public abstract class IDable<T> {
[DataMember]
public T ID { get; set; }
}
观察组
[DataContract(IsReference=true)]
[KnownType(typeof(DescriptiveObservation))]
[KnownType(typeof(NoteObservation))]
[KnownType(typeof(NumericObservation))]
[KnownType(typeof(ScoredObservation))]
public class ObservationGroup : IDable<int> {
[DataMember]
public string Title { get; set; }
[DataMember]
public List<Observation> Observations { get; set; }
[OnDeserializing]
void OnDeserializing(StreamingContext context)
{
init();
}
public ObservationGroup() {
init();
}
private void init()
{
Observations = new List<Observation>();
ObservationRecords = new List<ObservationRecord>();
}
}
描述性观察
[DataContract(IsReference = true)]
public class DescriptiveObservation : Observation
{
protected override ObservationType GetObservationType()
{
return ObservationType.Descriptive;
}
}
注意观察
[DataContract(IsReference = true)]
public class NoteObservation : Observation
{
protected override ObservationType GetObservationType()
{
return ObservationType.Note;
}
}
数值观察
[DataContract(IsReference = true)]
public class NumericObservation : Observation
{
[DataMember]
public double ConstraintMaximum { get; set; }
[DataMember]
public double ConstraintMinimum { get; set; }
[DataMember]
public int PrecisionMaximum { get; set; }
[DataMember]
public int PrecisionMinimum { get; set; }
[DataMember]
public string UnitType { get; set; }
protected override ObservationType GetObservationType()
{
return ObservationType.Numeric;
}
}
评分观察
[DataContract(IsReference = true)]
public class ScoredObservation : Observation {
[DataMember]
public int Value { get; set; }
protected override ObservationType GetObservationType() {
return ObservationType.Scored;
}
}
我对使用内置 JavaScriptSerializer 或 Newtonsoft JSON 库持公正态度。
序列化代码
var settings = new Newtonsoft.Json.JsonSerializerSettings();
settings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects;
Newtonsoft.Json.JsonConvert.SerializeObject(AnInitializedScoresheet, Newtonsoft.Json.Formatting.None, settings);
反序列化代码
return Newtonsoft.Json.JsonConvert.DeserializeObject(returnedStringFromClient, typeof(Scoresheet));
//Scoresheet contains a list of observationgroups
我得到的错误是
“无法创建 ProjectXCommon.DataStores.Observation 类型的实例。类型是接口或抽象类,无法实例化。”
任何帮助将不胜感激!
【问题讨论】:
-
我很确定它与您的
List<Observation>相关,反序列化程序正在尝试实例化Observation的类型,而不是它实际的特定类型。使用 Newtonsoft,您可以通过添加您自己的转换器来覆盖部分反序列化(这里是一个示例 gist.github.com/1140171)我不确定这对您有多大帮助,因为我不完全确定但相当肯定就是这种情况。 :) -
json 样本会有帮助
标签: c# json asp.net-mvc-3 json.net