ISerializable Циркуляр Ссылка
Я пытался понять, как правильно реализовать циклическую ссылку, используя интерфейс ISerializable. Но я не смог работать даже в простой форме, я прочитал объяснение здесь
Но я не смог его реализовать, я тоже пытался искать пример безрезультатно. Я проверил документацию по MSDN, но я не смог найти ссылки на то, как обрабатывать пользовательские сериализации с помощью циклических ссылок.
Самая простая форма, с которой я пробовал, это двойной связанный список.
2 ответа
Для сериализации циклической ссылки просто нужна стратегия, чтобы сериализовать весь объектный граф. для списка двойных ссылок вы можете начать с первого узла, а затем просто сериализовать следующий (предыдущий уже сериализован, поэтому ничего не нужно делать), а затем, когда вы захотите построить список снова, выполните то же самое, просто установите предыдущий узел для каждого из них последовательно (рекурсивно) как то так
public class LinkList : ISerializable
{
public Node First { get; set; }
public Node Tail { get; set; }
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Firts", First);
}
public LinkList(SerializationInfo info, StreamingContext context)
{
First = info.GetValue("First", typeof(Node)) as Node;
First.PrevNode = null;
//do one one while set the Tail of this class and LinkList proeprty for each node
}
}
public class Node : ISerializable
{
public LinkList LinkList { get; set; }
public Node(SerializationInfo info, StreamingContext context)
{
Name = info.GetString("Name");
NextNode = info.GetValue("NextNode", typeof(Node)) as Node;
if(NextNode != null)
NextNode.PrevNode = this;
}
public Node PrevNode
{
get;
set;
}
public Node NextNode
{
get;
set;
}
public string Name
{
get;
set;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Next", NextNode);
}
}
Один из способов заставить это работать - добавить поле ID в класс. Создайте связанный список целых чисел, которые будут привязаны к идентификатору поля, и свойство связанного списка только для чтения, которое будет заполняться на основе поиска ссылок на идентификаторы в связанном списке.
Единственным ограничением является то, что каждый объект в списке идентификаторов должен быть доступен при десериализации.