Код: Выделить всё
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);
}
}
}
Код: Выделить всё
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>
С этой конфигурацией я получаю исключение в строке: < /p>
DefaultUser = (User)info.GetValue(nameof(DefaultUser), typeof(User));
Код: Выделить всё
{
"Name": "User",
"Group": { "Name": "Group" }
}
< /code>
Итак, код в строке < /p>
DefaultUser = (User)info.GetValue(nameof(DefaultUser), typeof(User));
Код: Выделить всё
{
"Name": "User",
"Group": {
"Name": "Group",
"DefaultUser": null
}
}
< /code>
Решение, которое не использует атрибуты Newtonsoft.json, высоко ценится, поскольку я не хочу, чтобы моя библиотека классов имела внешние зависимости. Может быть, какой -нибудь пользовательский контрактроооформирование
Код: Выделить всё
ReferenceLoopHandling = ReferenceLoopHandling.Serialize
Подробнее здесь: https://stackoverflow.com/questions/796 ... wtonsoft-j