JavascriptSerializer - Serialisierungseigenschaft zweimal, wenn "neu" in Unterklasse @ verwendet wi
Versuchen, einen Dienst zu erstellen, um ein Objekt mit vielen gemeinsamen Eigenschaften zurückzugeben. In einigen Situationen sollte jedoch eine Eigenschaft stark eingeschränkt sein. Dies führt zu ungewöhnlichem und unerwünschtem Verhalten, bei dem ein Eigenschaftsname in der serialisierten Ausgabe wiederverwendet wird, was zu einem falschen Verhalten im Browser führt. Hier ist ein Beispiel, das in LINQPad eingefügt werden kann (wenn Sie einen Verweis auf @ hinzufügenSystem.Web.Extensions
) um das Problem zu sehen:
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"; } }
}
Dies druckt:
{"Stuff":"Common things","Status":{"Text":"Loads and loads and loads of things"}}
{"Status":{"Text":"A few things"},"Stuff":"Common things","Status":null}
Wenn JSON.parse im Browser aufgerufen wird, überschreibt der zweite Status den ersten, was bedeutet, dass Status immer null ist.
Die einzige Möglichkeit, dies zu beheben, ist die Umgestaltung, sodass FullStatus und LimitedStatus beide von einem gemeinsamen übergeordneten Element erben und @ verwendeoverride
lieber dasnew
- im realen Code etwas komplizierter, aber möglich. Ist meine Annahme richtig? Und außerdem würde mich interessieren, ob dies ein erwartetes Verhalten oder ein Bug ist.