我一直在尝试了解如何使用ISerializable接口正确实现循环引用。但是我甚至无法以简单的形式解决问题,我已经阅读了解释here
但是我无法实现它,我也尝试过寻找一个无效的例子。我已经检查了MSDN上的文档,但我无法参考如何使用循环引用处理自定义序列化。
我一直在尝试的最简单的形式是双重链接列表。
答案 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序列中的每个对象在反序列化时必须可用。