gpt4 book ai didi

c# - 在 Raven 中存储带有父子指针的树

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:04 25 4
gpt4 key购买 nike

我有一个树结构,其中的节点同时具有子指针和父指针。我在让它很好地序列化时遇到了一些问题(这将用于配置,因此它需要对操作/配置管理器有一定的可读性),并且在尝试了序列化约定和属性的不同组合之后我仍然卡住了。

我的类型是这样的:

public class NestedConfigurationTree<T> where T : class
{
public InternalNode<T> _root { get; set; }

public class InternalNode<TValue> where TValue : class
{
public Dictionary<string, InternalNode<TValue>> _children { get; set; }
public InternalNode<TValue> _parent { get; set; }
public TValue _value { get; set; }
}
}

当我允许循环引用 ([JsonObject(IsReference = true)]) 时,每个节点都会得到如下所示的 JSON:

        "$id": "3",
"_children": {
"ConfigurationItem": {
"$id": "4",
"_children": {},
"_parent": {
"$ref": "3"
},
"_value": "Some value"
}
},

这显然让最终用户感到困惑,他们不想要 $id 和 _parent 的东西。由于父级从文档结构中非常明显,我可以避免序列化它并在加载时以某种方式重新创建它吗?

此外,是否可以避免拥有公共(public)属性(property)?我最初将其写为 private readonly 字段,但这使得序列化程序忽略了所有这些字段。

最佳答案

并不是所有的东西都适合直接存储在数据库中。你已经展示了这种情况的一个很好的例子。如果您的最终用户会对它感到困惑,那么您想要针对它编写的任何查询也会感到困惑。

我的建议是拥有一个没有这些引用的树版本。序列化,看起来像这样:

{
"Value" : "A",
"Children" : [
{
"Value" : "B",
"Children" : [
{
"Value" : "C",
"Children" : [
{
"Value" : "D",
}
]
},
{
"Value" : "E",
"Children" : [
{
"Value" : "F",
"Children" : []
},
{
"Value" : "G",
"Children" : []
}
]
}
]
}
]
}

序列化时,您只需忽略父/子链接,而反序列化时,您会将它们连接起来。

您可以在自定义 JsonConverter 中完成这一切,而不是第二组类 - 这使您可以对如何序列化或反序列化任何特定实体进行细粒度控制。

另一种选择(也许是最简单的)是使用方法而不是属性来遍历链接。换句话说,而不是:

Node Parent { get; }
IEnumerable<Node> Children { get; }

你会使用:

Node GetParent();
IEnumerable<Node> GetChildren();

在序列化过程中不会遵循方法,因此这是最简单的事情。

关于c# - 在 Raven 中存储带有父子指针的树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15503866/

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