Циклические ссылки при сериализации - C#
Формулировка задачи:
Есть три объекта: "Школа", "Учитель", "Ученик". "Школа" знает всех своих учителей и учеников, "Учитель" знает где работает и всех своих учеников, "Школьник" знает где учится, и своего учителя. Короче, мешанина циклических ссылок, но все отлично работает. Но только до тех пор, пока не придется сериализовать экземпляр класса "Школа". XmlSerializer валится с ошибкой "При сериализации объекта типа ... обнаружена циклическая ссылка.", DataContractJsonSerializer просто игнорирует такие объекты. BinaryFormatter справляется каким-то образом, но очень долго, и на выходе слишком "тяжелый" файл.
Как избавиться от циклических ссылок, сохранив при этом связи между объектами? На первый взгляд логично в дочерних объектах хранить только какие-то id-шники, но как по этому id получить экземпляр нужного класса?
Решение задачи: «Циклические ссылки при сериализации»
textual
Листинг программы
- public class School
- {
- public int id;
- public List<int> studentIds;
- [XmlIgnore]
- public List<Student> students;
- public List<int> teacherIds;
- [XmlIgnore]
- public List<Teacher> teachers;
- }
- public class Teacher
- {
- public int id;
- public List<int> studentIds;
- [XmlIgnore]
- public List<Student> students;
- public int schoolId;
- [XmlIgnore]
- public School school;
- }
- public class Student
- {
- public int id;
- public int teacherId;
- [XmlIgnore]
- public Teacher Teacher;
- public int schoolId;
- [XmlIgnore]
- public School school;
- }
- public class SchoolDataBase
- {
- public List<School> schools;
- public List<Teacher> teachers;
- public List<Student> students;
- public void SetData()
- {
- var schoolsDic = schools.ToDictionary(s => s.id, s => s);
- var teachersDic = teachers.ToDictionary(s => s.id, s => s);
- var studentsDic = students.ToDictionary(s => s.id, s => s);
- foreach (var school in schools)
- {
- school.teachers = school.teacherIds.Select(id => teachersDic[id]).ToList();
- school.students = school.studentIds.Select(id => studentsDic[id]).ToList();
- }
- foreach (var teacher in teachers)
- {
- teacher.students = teacher.studentIds.Select(id => studentsDic[id]).ToList();
- teacher.school = schoolsDic[teacher.schoolId];
- }
- foreach (var student in students)
- {
- student.Teacher = teachersDic[student.id];
- student.school = schoolsDic[student.schoolId];
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д