using Newtonsoft.Json;
namespace NewtonsoftJSONTest
{
internal class Program
{
static void Main(string[] args)
{
var user = new DataClasses.User { Name = "User" };
var group = new DataClasses.UserGroup { Name = "Group", DefaultUser = user };
user.Group = group;
var settings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
var json = JsonConvert.SerializeObject(user, settings);
var userRestored = JsonConvert.DeserializeObject(json);
}
}
}
Mit dieser Konfiguration erhalte ich eine Ausnahme auf DefaultUser = (Benutzer) info.getValue (nameof (defaultUser), typeof (Benutzer)); Zeile:
system.runtime. gefunden. '< /p>
< /blockquote>
Newtonsoft.json obtaints SerializationInfo für ein Objekt, findet aber nicht in JSON -Eigenschaften ein, die eine Referenzschleife sind. Und JSON ist {"Name": "Benutzer", "Gruppe": {"Name": "Group"}} , so defaultUser = (Benutzer) info.getValue (nameOf (DefaultUser), Typof (Benutzer)); findet DefaultUser nicht. Ich kann eine Workaround -Erweiterungsmethode implementieren, SerializationInfo. {"Name": "Benutzer", "Gruppe": {"Name": "Gruppe", "DefaultUser": null}} ? Eine Lösung, die keine Newtonsoft.json -Attribute verwendet, wird sehr geschätzt, da ich nicht möchte, dass meine Klassenbibliothek externe Abhängigkeiten hat. Vielleicht kann mir ein benutzerdefiniertes Contractresolver helfen? Mit Referenceloophandling = Referenceloophandling.Serialize Flag erhalten eine Ausnahme:
System.StackoverFlowException: 'Ausnahme vom Typ' System.stackoverFlowException 'wurde geworfen. Sieht aus wie System.Text.json mit referenceHandler.Ignorecyclen -Option erzeugt JSON, die ich brauche, aber sie unterstützt nicht iserializable, daher ist es für mich nicht geeignet.
Ich habe eine NetSpandard20 Klassenbibliothek (ohne zusätzliche Abhängigkeiten) mit einigen Klassen, die iSerializable : implementieren[code]using System; using System.Runtime.Serialization;
namespace DataClasses { [Serializable] internal sealed class User : ISerializable { public string Name { get; set; } public UserGroup Group { get; set; } internal User() {} private User(SerializationInfo info, StreamingContext context) { Name = (string)info.GetValue(nameof(Name), typeof(string)); Group = (UserGroup)info.GetValue(nameof(Group), typeof(UserGroup)); } public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue(nameof(Name), Name); info.AddValue(nameof(Group), Group); } }
[Serializable] internal sealed class UserGroup : ISerializable { public string Name { get; set; } public User DefaultUser { get; set; } internal UserGroup() { } private UserGroup(SerializationInfo info, StreamingContext context) { Name = (string)info.GetValue(nameof(Name), typeof(string)); DefaultUser = (User)info.GetValue(nameof(DefaultUser), typeof(User)); } public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue(nameof(Name), Name); info.AddValue(nameof(DefaultUser), DefaultUser); } } } [/code] und Ich haben eine net80 -Konsole -Anwendung, auf die auf Newtonsoft.json verweist und diese Klassen serialisiert/deserialisiert[code]using Newtonsoft.Json;
namespace NewtonsoftJSONTest { internal class Program { static void Main(string[] args) { var user = new DataClasses.User { Name = "User" }; var group = new DataClasses.UserGroup { Name = "Group", DefaultUser = user }; user.Group = group; var settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; var json = JsonConvert.SerializeObject(user, settings); var userRestored = JsonConvert.DeserializeObject(json); } } } [/code] Mit dieser Konfiguration erhalte ich eine Ausnahme auf DefaultUser = (Benutzer) info.getValue (nameof (defaultUser), typeof (Benutzer)); Zeile:
[b] system.runtime. gefunden. '< /p> < /blockquote> Newtonsoft.json obtaints SerializationInfo für ein Objekt, findet aber nicht in JSON -Eigenschaften ein, die eine Referenzschleife sind. Und JSON ist {"Name": "Benutzer", "Gruppe": {"Name": "Group"}} , so defaultUser = (Benutzer) info.getValue (nameOf (DefaultUser), Typof (Benutzer)); findet DefaultUser nicht. Ich kann eine Workaround -Erweiterungsmethode implementieren, SerializationInfo. {"Name": "Benutzer", "Gruppe": {"Name": "Gruppe", "DefaultUser": null}} ? Eine Lösung, die keine Newtonsoft.json -Attribute verwendet, wird sehr geschätzt, da ich nicht möchte, dass meine Klassenbibliothek externe Abhängigkeiten hat. Vielleicht kann mir ein benutzerdefiniertes Contractresolver helfen? Mit Referenceloophandling = Referenceloophandling.Serialize Flag erhalten eine Ausnahme:
System.StackoverFlowException: [/b] 'Ausnahme vom Typ' System.stackoverFlowException 'wurde geworfen. Sieht aus wie System.Text.json mit referenceHandler.Ignorecyclen -Option erzeugt JSON, die ich brauche, aber sie unterstützt nicht iserializable, daher ist es für mich nicht geeignet.
Ich habe eine Klassenbibliothek (ohne zusätzliche Abhängigkeiten) Targeting .net Standard 2.0 mit einigen Klassen, die iSerializable :
implementieren using System;
using...
Präambel: Ich weiß über iSerializable Abschaltung. Wir müssen es verwenden, weil wir eine massive Legacy -Codebasis für IPC haben (die diese Schnittstelle verwendet). Wir migrieren von .NET Remoting...
Ich muss eine JSON-Schema-Datei für einige Anforderungs-/Antwortstrukturen eines API-Project schreiben, damit ich sie mit JSON.NET-Schema verwenden kann. Da einige der Objekte in Mutiple...