Циклические ссылки при сериализации - C#

Узнай цену своей работы

Формулировка задачи:

Есть три объекта: "Школа", "Учитель", "Ученик". "Школа" знает всех своих учителей и учеников, "Учитель" знает где работает и всех своих учеников, "Школьник" знает где учится, и своего учителя. Короче, мешанина циклических ссылок, но все отлично работает. Но только до тех пор, пока не придется сериализовать экземпляр класса "Школа". XmlSerializer валится с ошибкой "При сериализации объекта типа ... обнаружена циклическая ссылка.", DataContractJsonSerializer просто игнорирует такие объекты. BinaryFormatter справляется каким-то образом, но очень долго, и на выходе слишком "тяжелый" файл. Как избавиться от циклических ссылок, сохранив при этом связи между объектами? На первый взгляд логично в дочерних объектах хранить только какие-то id-шники, но как по этому id получить экземпляр нужного класса?

Решение задачи: «Циклические ссылки при сериализации»

textual
Листинг программы
  1.     public class School
  2.     {
  3.         public int id;
  4.         public List<int> studentIds;
  5.         [XmlIgnore]
  6.         public List<Student> students;
  7.         public List<int> teacherIds;
  8.         [XmlIgnore]
  9.         public List<Teacher> teachers;
  10.     }
  11.  
  12.     public class Teacher
  13.     {
  14.         public int id;
  15.         public List<int> studentIds;
  16.         [XmlIgnore]
  17.         public List<Student> students;
  18.         public int schoolId;
  19.         [XmlIgnore]
  20.         public School school;      
  21.     }
  22.  
  23.     public class Student
  24.     {
  25.         public int id;
  26.         public int teacherId;
  27.         [XmlIgnore]
  28.         public Teacher Teacher;
  29.         public int schoolId;
  30.         [XmlIgnore]
  31.         public School school;
  32.     }
  33.  
  34.     public class SchoolDataBase
  35.     {
  36.         public List<School> schools;
  37.         public List<Teacher> teachers;
  38.         public List<Student> students;
  39.  
  40.         public void SetData()
  41.         {
  42.             var schoolsDic = schools.ToDictionary(s => s.id, s => s);
  43.             var teachersDic = teachers.ToDictionary(s => s.id, s => s);
  44.             var studentsDic = students.ToDictionary(s => s.id, s => s);
  45.  
  46.             foreach (var school in schools)
  47.             {
  48.                 school.teachers = school.teacherIds.Select(id => teachersDic[id]).ToList();
  49.                 school.students = school.studentIds.Select(id => studentsDic[id]).ToList();
  50.             }
  51.             foreach (var teacher in teachers)
  52.             {
  53.                 teacher.students = teacher.studentIds.Select(id => studentsDic[id]).ToList();
  54.                 teacher.school = schoolsDic[teacher.schoolId];
  55.             }
  56.             foreach (var student in students)
  57.             {
  58.                 student.Teacher = teachersDic[student.id];
  59.                 student.school = schoolsDic[student.schoolId];
  60.             }
  61.         }
  62.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут