gpt4 book ai didi

c# - 树结构的序列化/反序列化

转载 作者:太空狗 更新时间:2023-10-29 22:29:31 25 4
gpt4 key购买 nike

我正在尝试找出保存(序列化)和稍后打开(反序列化)树结构的最佳方法。我的结构由具有不同属性的各种对象类型组成,但每个对象类型都继承自一个基本抽象“节点”类。

每个节点都有唯一的 ID (GUID),并且有一个 AddSuperNode(Node nd) 方法来设置节点的父节点。这又会调用其他方法,让父节点知道它有哪些子节点。但是,一些节点还利用 AddAuxSuperNode() 方法向节点添加次级父节点。

我之前使用的是二进制序列化,但现在我想我想使用一些我有更多控制权并且序列化数据更容易访问的东西。我还想在反序列化时保留类型信息,并能够序列化私有(private)值。所以 DataContractSerializer 似乎是最好的选择。

我不能直接序列化根节点,因为节点有多个父节点。我不想创建重复的对象。所以看起来我需要将树解构为一个平面列表,然后将其序列化。然后在序列化该列表后重建树。这听起来对吗?

正如我之前所说,每个节点 都有一个唯一的 GUID 标识符,但现在节点直接引用它们的父/子节点并且不存储它们的 ID。除了直接引用之外,我还可以更新 AddSuperNode()AddAuxSuperNode() 方法来更新要序列化的父 ID 列表。但我宁愿只在对象被序列化时更新/创建这个列表。所以我想在节点中创建一个 UpdateSuperNodeIDRefs() 方法,该方法将在序列化之前立即调用。

以下是我计划对该结构进行序列化和反序列化的操作。谁能建议更好/更清洁/更有效的方法来做到这一点?

序列化

1)提供树结构的根节点

2) 将树结构分解成一个扁平的字典(Guid id,Node nd) 其中idguid

3) 调用UpdateSuperNodeIDRefs();为每个节点更新它为其父节点保存的 ID。

4) 使用DataContractSerializer

序列化节点的 Dictionary

反序列化

1) 反序列化节点的字典

2) 遍历字典中的每个节点,将每个节点重新连接到它们的父节点。对于存储的任何父 ID,在 Dictionary 中找到具有匹配 ID 的相应Node,调用 AddSuperNode()AddAuxSuperNode() 将节点重新连接到其父节点

3) 从字典中的任何节点找到结构的根

4) 返回根节点

最佳答案

如果一个节点有多个父节点,那么它就不是一棵树;它大概是一个图形。但是-不用担心; DataContractSerializer 可以为您处理:

using System;
using System.IO;
using System.Runtime.Serialization;

[DataContract]
class Node {
[DataMember]
public Node AnotherNode { get; set; }
}

static class Program
{
static void Main()
{
Node a = new Node(), b = new Node();
// make it a cyclic graph, to prove reference-mode
a.AnotherNode = b;
b.AnotherNode = a;

// the preserveObjectReferences argument is the interesting one here...
DataContractSerializer dcs = new DataContractSerializer(
typeof(Node), null, int.MaxValue, false, true, null);
using (MemoryStream ms = new MemoryStream())
{
dcs.WriteObject(ms, a);
ms.Position = 0;
Node c = (Node) dcs.ReadObject(ms);
// so .AnotherNode.Another node should be back to "c"
Console.WriteLine(ReferenceEquals(c, c.AnotherNode.AnotherNode));
}

}
}

关于c# - 树结构的序列化/反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/736568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com