我试图找出保存(序列化)并稍后打开(反序列化)树结构的最佳方法。我的结构由具有不同属性的各种对象类型组成,但每个对象类型都继承自基本抽象“Node”类。
每个节点都有唯一的 ID (GUID),并且有一个 AddSuperNode(Node nd) 方法来设置节点的父节点。这又会调用其他方法,让父节点知道它有哪些子节点。然而,一些节点也利用添加辅助超级节点()向 Node 添加次要父级的方法。
我曾经使用二进制序列化,但现在我想我想使用一些我有更多控制权的东西,并且序列化数据更容易访问。我还想在反序列化时保留类型信息,并且能够序列化私有值。所以数据契约序列化器似乎是最好的方法。
我不能只序列化根Node直接因为节点有多个父节点。我不想创建重复的对象。所以看来我需要将树解构为平面列表,然后将其序列化。然后序列化该列表后重建树。这听起来正确吗?
就像我之前说的那样Node有一个唯一的 GUID 标识符,但现在节点直接引用它们的父级/子级,并且不存储它们的 id。我可以更新添加超级节点() and 添加辅助超级节点()除了直接引用之外,还可以更新要序列化的父 ID 列表的方法。但我宁愿只在对象被序列化时更新/创建此列表。所以我想创建一个更新SuperNodeIDRefs()节点中的方法将在序列化之前调用。
以下是我计划对该结构进行序列化和反序列化的操作。谁能建议一种更好/更清洁/更有效的方法来做到这一点?
序列化
1)提供树结构的根节点
2)将树结构分解为扁平结构字典(Guid id,节点nd) where id is the guid of nd.
3) Call 更新SuperNodeIDRefs();每个节点更新它为其父节点保存的 ID。
4)序列化字典的节点数数据契约序列化器
反序列化
1)反序列化字典节点数
2)迭代每个Node in the 字典,重新联系每个人与父母。对于存储的任何父 ID,找到相应的Node(s) 在字典与匹配的 ID 调用添加超级节点() or 添加辅助超级节点()将节点重新连接到其父节点
3)从任何Node在字典中找到结构的根
4)返回根Node