Serialisieren/Deserialisieren Sie eine Referenz von iSerializierbaren Objekten mit Newtonsoft.json (JSON.net)C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Serialisieren/Deserialisieren Sie eine Referenz von iSerializierbaren Objekten mit Newtonsoft.json (JSON.net)

Post by Anonymous »

Ich habe eine NetSpandard20 Klassenbibliothek (ohne zusätzliche Abhängigkeiten) mit einigen Klassen, die iSerializable :
implementieren

Code: Select all

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);
}
}
}
und Ich haben eine net80 -Konsole -Anwendung, auf die auf Newtonsoft.json verweist und diese Klassen serialisiert/deserialisiert

Code: Select all

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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post