0

我一直在尝试了解如何使用 ISerializable 接口正确实现循环引用。但即使是简单的形式我也无法解决,我已经阅读了这里的解释

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

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

4

2 回答 2

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

    }
}
于 2014-02-02T01:18:49.470 回答
0

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

对此的一个限制是,ID 列表中的每个对象在反序列化时都必须可用。

于 2014-02-02T00:22:38.957 回答