【问题标题】:ISerializable Circular ReferenceISerializable 循环引用
【发布时间】:2014-02-02 00:18:33
【问题描述】:

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

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

我尝试过的最简单的形式是双向链表。

【问题讨论】:

  • 如果不自己处理 entire/outer 对象图并手动断开/链接引用,我认为这是不可能的。也就是说,不是序列化Node,而是序列化LinkedList(表示来自此类节点的列表)并在其中手动处理序列化。

标签: c# circular-reference iserializable


【解决方案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);

    }
}

【讨论】:

  • 这正是我所需要的,我认为方向图的相同基本方法也可以工作(在我发布时尝试)?
  • @Nuku 如果您将图形存储在链表结构中,您可以使用相同的策略尝试递归序列化(类似于以前)来处理圆圈,您可以使用一个标志来显示节点是否已序列化在下一次序列化节点之前和如果是这样,您可以只在其中放置一个 id,然后在反序列化之后您应该重新建立关系。(注意性能,您应该迭代 graph 的节点多少次)但是如果您使用具有 Adjacency 的结构矩阵en.wikipedia.org/wiki/Adjacency_matrix 然后您可以轻松地序列化每个节点,然后序列化矩阵本身。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多