【发布时间】:2015-01-15 03:50:07
【问题描述】:
我知道很多人都以某种方式面临同样的问题,但我感到困惑的是,Newtonsoft JSON Serializer 为何能够正确处理这种情况,而 JavaScriptSerializer 却无法做到。
我将使用在另一个 stackoverflow 线程 (JavascriptSerializer serializing property twice when "new" used in subclass) 中使用的相同代码示例
void Main()
{
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var json = serializer.Serialize(new Limited());
Limited status = serializer.Deserialize<Limited>(json); --> throws AmbiguousMatchException
}
public class Full
{
public String Stuff { get { return "Common things"; } }
public FullStatus Status { get; set; }
public Full(bool includestatus)
{
if(includestatus)
Status = new FullStatus();
}
}
public class Limited : Full
{
public new LimitedStatus Status { get; set; }
public Limited() : base(false)
{
Status = new LimitedStatus();
}
}
public class FullStatus
{
public String Text { get { return "Loads and loads and loads of things"; } }
}
public class LimitedStatus
{
public String Text { get { return "A few things"; } }
}
但如果我使用 Newtonsoft Json Serializer,一切正常。为什么?是否可以使用 JavaScriptSerializer 实现相同的目标?
void Main()
{
var json = JsonConvert.SerializeObject(new Limited());
Limited status = JsonConvert.DeserializeObject<Limited>(json); ----> Works fine.
}
【问题讨论】:
-
如果我错了请纠正我,但我相信你想使用 Serializer.deserialize
(json); -
LimitedStatus 与 FullStatus 不同,您隐藏了公共基类属性。在我看来,这个模型应该有一个带有 Stuff 属性的基类,并且后代应该使用 FullStatus 和 LimitedStatus 的接口来实现行为,而不是使用相同的属性名称。 JavaScript 序列化器将清楚地了解它需要做什么。另外,为什么不使用 DatacontractJsonSerializer?
标签: c# json serialization json.net javascriptserializer