2015-05-20 116 views
2

使用7.0.1 Beta3版本,我试图序列化/反序列化具有抽象类数组属性的复杂POCO。这些数组可以包含从抽象类派生的类的实例。无法创建类型为X的实例。类型是一个接口或抽象类,不能实例化

在序列化中,一切似乎都没问题。下面的Json片段显示类型信息设置正确。

JSON的片段:

"Items": 
[ 
    { 
     "$type": "IVXB_TS, ...", 
     "inclusive": true, 
     "value": "20091231" 
    } 
] 

但它失败,出现以下错误反序列化:

无法创建类型数量的实例。 Type是一个接口或抽象类,不能实例化。

的类层次结构如下:

[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))] 
public abstract partial class ANY : object, System.ComponentModel.INotifyPropertyChanged 
{ 
} 

[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))] 
public abstract partial class QTY : ANY 
{ 
} 

[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))] 
public partial class TS : QTY 
{ 
} 

public partial class IVXB_TS : TS 
{ 
} 

的项目属性:

[System.Xml.Serialization.XmlElementAttribute("high", typeof(IVXB_TS))] 
[System.Xml.Serialization.XmlElementAttribute("low", typeof(IVXB_TS))] 
public QTY[] Items 

在JSON片段的类型信息,似乎不能使用。这是一个反序列化配置问题吗?

回答

4

解决此问题的方法是将解串器配置为使用json中的类型信息。它不是默认使用的。

系列化做这样:

Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer(); 
serializer.Converters.Add(new Newtonsoft.Json.Converters.JavaScriptDateTimeConverter()); 
serializer.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
serializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto; 
serializer.Formatting = Newtonsoft.Json.Formatting.Indented; 

using (StreamWriter sw = new StreamWriter(fileName)) 
using (Newtonsoft.Json.JsonWriter writer = new Newtonsoft.Json.JsonTextWriter(sw)) 
{ 
    serializer.Serialize(writer, obj, typeof(MyDocumentType)); 
} 

在反序列化,对于TypeNameHandling的设置必须设置:

MyDocumentType obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MyDocumentType>(File.ReadAllText(fileName), new Newtonsoft.Json.JsonSerializerSettings 
{ 
    TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto, 
    NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore, 
}); 
相关问题