by Anonymous » 11 Jul 2025, 12:53
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.
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.