我一直在尝试了解如何使用 ISerializable 接口正确实现循环引用。但即使是简单的形式我也无法解决,我已经阅读了这里的解释
但我一直无法实现它,我也试过找一个例子无济于事。我已经检查了 MSDN 上的文档,但我无法参考如何使用循环引用处理自定义序列化。
我一直在尝试的最简单的形式是双向链表。
我一直在尝试了解如何使用 ISerializable 接口正确实现循环引用。但即使是简单的形式我也无法解决,我已经阅读了这里的解释
但我一直无法实现它,我也试过找一个例子无济于事。我已经检查了 MSDN 上的文档,但我无法参考如何使用循环引用处理自定义序列化。
我一直在尝试的最简单的形式是双向链表。
序列化循环引用只需要一种序列化整个对象图的策略即可。对于双链接列表,您可以从第一个节点开始,然后只序列化下一个节点,(前一个节点已经序列化,所以无事可做)然后当您想再次构建列表时,只需为每个节点依次设置前一个节点(递归地)像这样的东西
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 字段。制作一个与字段 ID 相关联的整数链接列表,以及一个只读链接列表属性,该属性将根据在链接列表中查找对 ID 的引用来填充。
对此的一个限制是,ID 列表中的每个对象在反序列化时都必须可用。