2015-04-13 1 views
18

Ich habe ein komplexes Objektdiagramm, das ich mit Json.NET serialisieren/deserialisieren. Einige der Objekte stammen von einer abstrakten Klasse. Damit die Deserialisierung ordnungsgemäß funktioniert, musste ich eine benutzerdefinierte JsonConverter erstellen. Seine einzige Aufgabe ist es, die entsprechende konkrete Implementierung der abstrakten Klasse zur Deserialisierungszeit auszuwählen und es Json.NET zu ermöglichen, seinen Weg fortzusetzen.Verwendung der Standardserialisierung in einem benutzerdefinierten JsonConverter

Mein Problem kommt, wenn ich serialisieren möchte. Ich brauche überhaupt nichts Brauchbares. Ich möchte genau das gleiche Verhalten erhalten, wie ich es mit JsonConvert.SerializeObject ohne benutzerdefinierte JsonConverter bekommen würde.

Da ich jedoch die benutzerdefinierte JsonConverter-Klasse für meine Deserialisierungsanforderungen verwende, muss ich eine WriteJson Implementierung bereitstellen. Da WriteJson abstrakt ist, kann ich nicht einfach base.WriteJson anrufen, aber ich möchte im Wesentlichen das tun. Meine Frage ist also, was setze ich in diese Methode ein, um das Jane-Standardverhalten zu erhalten? Mit anderen Worten:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    // What goes here to get default processing? 
} 

Antwort

26

in Ihrer benutzerdefinierten JsonConverter, außer Kraft setzen CanWrite und return false:

public override bool CanWrite { get { return false; } } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

Dann können Sie nur eine Ausnahme von WriteJson werfen, da sie nicht genannt werden erhalten.

+2

Es war zu offensichtlich :). Vielen Dank! – MuiBienCarlota