Json.Net - Fehler beim abrufen der Wert von "ScopeId" on " - System.Net.IPAddress'
Ich versuche zu serialisieren eines IPEndpoint Objekt mit Json.Net und bekomme ich die folgende Fehlermeldung:
Fehler beim abrufen der Wert von "ScopeId" on " - System.Net.IPAddress'.
Die Ursache des Fehlers ist, dass ich mich nur mit der IPV4-Eigenschaften der IPAddress-Objekt im Endpunkt. Wenn der Json-parser versucht, um eine Analyse der IPv6-Teil, es greift auf die ScopeID Eigenschaft, die wirft eine socket exception "Der Vorgang wird nicht unterstützt für den Typ des referenzierten Objekts" (Ein null-hätte ausgereicht, microsoft!)
Ich Frage mich, ob es möglicherweise ein workaround für diese andere als die rippen, alles auseinander und Codierung der Adresse Informationen als string? Irgendwann möchte ich mir die Unterstützung von IPV6. Gibt es etwas, das getan werden kann, in Json.NET um den Fehler zu ignorieren oder einfach NICHT versuchen zu serialisieren der ScopeID wenn die IP-Adresse Familie ist festgelegt Internetz statt InternetworkIPV6?
Dank,
Dinsdale
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
IPAddress
Klasse ist nicht sehr freundlich zur Serialisierung, wie Sie gesehen haben. Es wird nicht nur werfen eineSocketException
wenn Sie versuchen, Zugriff auf dieScopeID
Feld für eine IPv4-Adresse, aber es wird auch auslösen, wenn Sie versuchen, Zugriff auf dieAddress
Feld direkt für eine IPv6-Adresse.Bekommen rund um die Ausnahmen, benötigen Sie ein benutzerdefiniertes
JsonConverter
. Ein Konverter ermöglicht es Ihnen zu erzählen Json.Net genau wie Sie möchten, es zu serialisieren und/oder Deserialisieren einen bestimmten Typ von Objekt. Für eineIPAddress
scheint es der einfachste Weg, um die Daten erfüllt, dass jeder einfach zu konvertieren, um seine string-Darstellung und zurück. Wir können dies in den Konverter. Hier ist, wie würde ich es schreiben:Recht einfach, wie diese Dinge gehen. Aber das ist noch nicht das Ende der Geschichte. Wenn Sie brauchen, um go round-trip-mit Ihren
IPEndPoint
, dann brauchst du einen converter für Sie als gut. Warum? DaIPEndPoint
enthält keinen Standard-Konstruktor, so Json.Net nicht weiß, wie Sie zu instanziieren. Zum Glück, dieser Konverter ist nicht schwer zu schreiben:So, jetzt haben wir den Konvertern, wie verwenden wir Sie? Hier ist ein einfaches Beispiel-Programm demonstriert. Es erstellt zunächst ein paar von Endpunkten, serialisiert Sie zu JSON unter Verwendung des benutzerdefinierten Konverter, dann sofort deserialisiert die JSON zurück in die endpoints erneut mit den gleichen Wandler.
Hier ist die Ausgabe:
Fiddle: https://dotnetfiddle.net/tK7NKY
WriteJson
kann vereinfacht mitJObject
zu.