2014-02-02 3 views
0

Я пытался понять, как правильно реализовать круговую ссылку, используя интерфейс ISerializable. Но я не смог работать даже в простой форме, я прочитал объяснение. hereISERializable Circular Reference

Но я не смог его реализовать, я также попытался найти пример безрезультатно. Я проверил документацию по MSDN, но я не могу ссылаться на то, как обрабатывать пользовательскую сериализацию с помощью циклических ссылок.

Простейшая форма, с которой я пытаюсь, - это список с двойной связью.

+0

Не думаю, что это возможно без обработки объектного графа * всего/внешнего * и ручного разрыва ссылок. То есть вместо сериализации «Node», сериализуйте «LinkedList» (который представляет собой список из таких узлов) и вручную обрабатывайте сериализацию. – user2864740

ответ

1

Сериализовать круговую ссылку просто нужна стратегия сериализации всего графика объекта. для двойного списка ссылок вы можете начать с первого узла, а затем просто сериализовать следующий, (предыдущий уже сериализован, поэтому ничего не делать), а затем, когда вы хотите создать список снова, сделайте то же самое, просто установите предыдущий узел для каждого из них последовательно (рекурсивно) что-то вроде этого

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); 

    } 
} 
+0

Это именно то, что мне нужно было обвести вокруг него, я предполагаю, что такой же базовый подход для графического графика также будет работать (стараясь это сделать, как я пишу)? – Nuku

+0

@Nuku, если вы храните свой график в структуре связанных списков, вы можете использовать одну и ту же стратегию. Попробуйте сериализовать рекурсивно (что-то вроде раньше), чтобы иметь дело с кругами, вы можете иметь один флаг, который показывает, был ли узел сериализован раньше, и если это так для следующего время для сериализации узла вы можете просто поместить один идентификатор там, после десериализации вы должны переделать отношения. (обратите внимание на производительность, сколько раз вы должны перебирать узлы графика) , но если вы используете структуру с матрицей Adjacency http: // en.wikipedia.org/wiki/Adjacency_matrix, то вы можете легко сериализовать каждый узел, а затем и матрицу. – Mojtaba

0

Один из способов заставить это работать, чтобы добавить поле идентификатора в класс. Создайте связанный список целых чисел, которые будут привязаны к идентификатору поля, и свойство с включенным списком ссылок, которое будет заполнено на основе поиска ссылок на идентификаторы в связанном списке.

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

Смежные вопросы