by Anonymous » 11 Jul 2025, 17:15
Ich habe eine Klassenbibliothek (ohne zusätzliche Abhängigkeiten) Targeting .net Standard 2.0 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 .NET 8.0 -Konsolenanwendung, auf die sich 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);
}
}
}
< /code>
Mit dieser Konfiguration erhalte ich eine Ausnahme in der Zeile: < /p>
DefaultUser = (User)info.GetValue(nameof(DefaultUser), typeof(User));
System.runtime.Serialization.SerializationException: Mitglied 'DefaultUser' wurde nicht gefunden. /> Der JSON ist < /p>
Code: Select all
{
"Name": "User",
"Group": { "Name": "Group" }
}
< /code>
Also der Code in Zeile < /p>
DefaultUser = (User)info.GetValue(nameof(DefaultUser), typeof(User));
findet defaultUser nicht. Ich kann eine Workaround -Erweiterungsmethode serializationInfo implementieren. So etwas wie: < /p>
Code: Select all
{
"Name": "User",
"Group": {
"Name": "Group",
"DefaultUser": null
}
}
< /code>
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 ein benutzerdefiniertes Contractresolver
kann mir helfen?
Beispielprojekt Repo.
Code: Select all
ReferenceLoopHandling = ReferenceLoopHandling.Serialize
Flag Es wird diese Ausnahme abgerufen:
System.StackoverFlowexception: Ausnahme des Typs 'System.StackoverFlowexception' wurde geworfen. Die Option produziert JSON, die ich brauche, aber sie unterstützt nicht iSerializable daher ist 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[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 .NET 8.0 -Konsolenanwendung, auf die sich 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 in der Zeile: < /p>
DefaultUser = (User)info.GetValue(nameof(DefaultUser), typeof(User));
[/code]
System.runtime.Serialization.SerializationException: Mitglied 'DefaultUser' wurde nicht gefunden. /> Der JSON ist < /p>
[code]{
"Name": "User",
"Group": { "Name": "Group" }
}
< /code>
Also der Code in Zeile < /p>
DefaultUser = (User)info.GetValue(nameof(DefaultUser), typeof(User));
[/code]
findet defaultUser nicht. Ich kann eine Workaround -Erweiterungsmethode serializationInfo implementieren. So etwas wie: < /p>
[code]{
"Name": "User",
"Group": {
"Name": "Group",
"DefaultUser": null
}
}
< /code>
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 ein benutzerdefiniertes Contractresolver [/code] kann mir helfen?
Beispielprojekt Repo.[code]ReferenceLoopHandling = ReferenceLoopHandling.Serialize
[/code]
Flag Es wird diese Ausnahme abgerufen:
System.StackoverFlowexception: Ausnahme des Typs 'System.StackoverFlowexception' wurde geworfen. Die Option produziert JSON, die ich brauche, aber sie unterstützt nicht iSerializable daher ist für mich nicht geeignet.