Serialize/Deserialize referenceLoop of Iserializable Objects с Newtonsoft.json (json.net)C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Serialize/Deserialize referenceLoop of Iserializable Objects с Newtonsoft.json (json.net)

Сообщение Anonymous »

Преамбула: я знаю о Iserializable Унимок. Мы должны использовать его, потому что у нас есть огромная кодовая база Legacy для IPC (которая использует этот интерфейс). Мы мигрируем с удаленного .NET в кроссплатформенное решение. И мы планировали сохранить существующую настройку кодовой базы, если это возможно.

Код: Выделить всё

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);
}
}
}
И у меня есть приложение для консоли .net 8.0, которое ссылается на Newtonsoft.json и сериализует/десериализует эти классы (я использую InternalsVisibleto в библиотечном проекте класса, чтобы заставить его работать):

Код: Выделить всё

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));
system.runtime.serialization.serializationexception: участник 'defaultUser' не был найден. /> json < /p>

Код: Выделить всё

{
"Name": "User",
"Group": { "Name": "Group" }
}
< /code>
Итак, код в строке < /p>
DefaultUser = (User)info.GetValue(nameof(DefaultUser), typeof(User));
не может найти DefaultUser . Я могу реализовать метод обходного удлинения SerializationInfo.trightValue , как это (поскольку MS не планирует добавлять его), но использует ли использование Try Catch и, следовательно, медленно. Что -то вроде: < /p>

Код: Выделить всё

{
"Name": "User",
"Group": {
"Name": "Group",
"DefaultUser": null
}
}
< /code>
Решение, которое не использует атрибуты Newtonsoft.json, высоко ценится, поскольку я не хочу, чтобы моя библиотека классов имела внешние зависимости. Может быть, какой -то пользовательский контрактроолвер 
может помочь мне?
Пример проекта репо.

Код: Выделить всё

ReferenceLoopHandling = ReferenceLoopHandling.Serialize
flag. Производит JSON, который мне нужен, но он не поддерживает Iserializable , так что мне не подходит. Кроме того, System.text.json имеет свои собственные недостатки, например, у нее нет автоматической обработки типа. Я должен отметить свои классы базовых данных и интерфейсы с JSonDeriveDyTypeatTribute. Это 1) добавляет внешнюю зависимость в мою библиотеку классов (я стараюсь ее избегать) 2) болезненна, так как кодовая база массивная и, следовательно, дерево наследования также

Подробнее здесь: https://stackoverflow.com/questions/796 ... wtonsoft-j
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Serialize/Deserialize referenceLoop of Iserializable Objects с Newtonsoft.json (json.net)
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Serialize/Deserialize referenceLoop of Iserializable Objects с Newtonsoft.json (json.net)
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Serialize/Deserialize referenceLoop of Iserializable Objects с Newtonsoft.json (json.net)
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Serialize/Deserialize referenceLoop of Iserializable Objects с Newtonsoft.json (json.net)
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Serialize/Deserialize referenceLoop of Iserializable Objects с Newtonsoft.json (json.net)
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»