【发布时间】:2014-10-06 11:46:12
【问题描述】:
尝试创建一个服务以返回一个具有许多共享属性的对象,但在某些情况下一个属性应该受到高度限制。这会导致奇怪和不受欢迎的行为,其中属性名称在序列化输出中被重用,从而导致浏览器中的行为不正确。下面是一个例子,可以粘贴到LINQPad中(如果你添加了对System.Web.Extensions的引用)来查看问题:
void Main()
{
System.Web.Script.Serialization.JavaScriptSerializer json = new System.Web.Script.Serialization.JavaScriptSerializer();
json.Serialize(new Full(true)).Dump();
json.Serialize(new Limited()).Dump();
}
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"; } }
}
打印出来:
{"Stuff":"Common things","Status":{"Text":"Loads and loads and loads of things"}}
{"Status":{"Text":"A few things"},"Stuff":"Common things","Status":null}
在浏览器中调用 JSON.parse 时,第二个 Status 会覆盖第一个,这意味着 Status 始终为 null。
我能看到解决此问题的唯一方法是重构,以便 FullStatus 和 LimitedStatus 都从一个共同的父级继承并使用override 而不是new - 在现实世界的代码中有点复杂,但可能。我的假设正确吗?而且,我很想知道这是预期的行为还是错误。
【问题讨论】:
标签: c# json serialization javascriptserializer