Исключение циклической ссылки при сериализации классов LINQ to SQL

У меня есть набор классов linq to sql, и я сериализовал их в JSON с помощью .NET JavaScriptSerializer.

Однако, как только я добавляю запись в связанную таблицу, сериализация выдает «исключение циклической ссылки». Аааааа!

Это подробно описано здесь.

у меня есть несколько вариантов

  • Преобразуйте класс linq to sql в класс без отношений, чтобы избежать циклической ссылки
  • отрезать циклическую ссылку, обнулив ассоциации - я не считаю это реальным вариантом
  • Используйте ScriptIgnoreAttribute (каким-то образом). Я не мог легко применить это, потому что свойства находятся в сгенерированных классах, а LINQ to SQL не учитывает автоматически классы друзей.
  • Используйте JSON.NET и каким-то образом используйте атрибуты + классы друзей, чтобы остановить сериализатор, пытающийся пройти через отношения.

кто-нибудь еще сталкивался с этим? Я бы предпочел последний вариант, если это возможно, но я не знаю, как это сделать.

Любая помощь приветствуется


person CVertex    schedule 23.09.2009    source источник


Ответы (3)


Последняя версия Json.NET поддерживает сериализацию циклических отношений. См. Сохранение ссылок на объекты в справке.

person James Newton-King    schedule 25.09.2009
comment
Написал сообщение в блоге с подробным описанием настройки: johnnycode.com/blog/2012/04/10/ - person John B; 11.04.2012

Дополнительная ссылка для принятого ответа

Справка Json.NET, сохранение ссылок на объекты (с примером)

Кажется, он отлично работает с LINQ to SQL.

person Emir    schedule 23.10.2009

Решение Джеймса решило часть моей проблемы. Мне нужно было исключить определенные типы списков внутри объекта. Чтобы решить свою проблему, я просто скопировал нужные мне части объекта. Ниже приведен пример.

var DB = new DBDataContext();
            var lUsers = new List<User>();
            DB.Users.ToList().ForEach(x => lUsers.Add(new User()
                {
                    ID = x.ID,
                    FIRST_NAME = x.FIRST_NAME
                }) );
person Spencer    schedule 07.08.2013