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 в класс. Создайте связанный список целых чисел, которые будут привязаны к идентификатору поля, и свойство связанного списка только для чтения, которое будет заполняться на основе поиска ссылок на идентификаторы в связанном списке.

Единственным ограничением является то, что каждый объект в списке идентификаторов должен быть доступен при десериализации.

Другие вопросы по тегам