可ISISizable循环参考

时间:2014-02-02 00:18:33

标签: c# circular-reference iserializable

我一直在尝试了解如何使用ISerializable接口正确实现循环引用。但是我甚至无法以简单的形式解决问题,我已经阅读了解释here

但是我无法实现它,我也尝试过寻找一个无效的例子。我已经检查了MSDN上的文档,但我无法参考如何使用循环引用处理自定义序列化。

我一直在尝试的最简单的形式是双重链接列表。

2 个答案:

答案 0 :(得分: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);

    }
}

答案 1 :(得分:0)

使其工作的一个选择是向该类添加ID字段。创建一个与字段ID相关联的整数链接列表,以及一个只读链接列表属性,该属性将根据查找链接列表中ID的引用进行填充。

对此的一个约束是ID序列中的每个对象在反序列化时必须可用。