- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个树结构,其中的节点同时具有子指针和父指针。我在让它很好地序列化时遇到了一些问题(这将用于配置,因此它需要对操作/配置管理器有一定的可读性),并且在尝试了序列化约定和属性的不同组合之后我仍然卡住了。
我的类型是这样的:
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/
Raven.Client.Authorization 的当前版本是来自 Raven.Client 的版本。新的 Raven.Clients 允许您使用最新的 Json.Net 包,因此可以使用 Res
更具体地说,在Raven DB中,我想创建一个具有如下签名的通用方法: public void Clear() {... 然后让Raven DB清除给定类型的所有文档。 我从Ayende的其他帖子中了
我只是想确定 Raven DB 使用的文件系统上的文件是否加密?有人可以直接打开文件系统上的文件并将它们从二进制直接转换为 ASCII,还是加密? 我正试图说服我们的管理层给 RavenDB 一个机会
我正在尝试将带有异常报告的附加数据传递给sentri。 测试代码 Raven.captureMessage("test", {"blabla": "blabla"}) 在sentri admin中我可
我已经配置了raven来获取错误日志,我已经在哨兵控制面板中成功获取了日志,但是设置完成后,控制台日志就消失了。 我什至尝试通过在配置时将autoBreadcrumbs设置为false,仍然没有运气
我已经installed raven-js using Bower我正在使用 captureMessage()向 Sentry 发送自定义消息。 发送其中一条消息后,我需要重新加载页面。问题是,如果我
我需要获取特定集合中的文档计数: 现有索引 Raven/DocumentCollections 存储与属于该集合的实际文档配对的集合的计数和名称。如果可能的话,我想从此索引中获取计数。 这是 Rave
我正在构建一个脚本来检查损坏的索引并重置它们,但我在本地获取损坏的索引时遇到问题。 有人知道如何强制 RavenDB 索引损坏吗? 最佳答案 要导致损坏,您可以删除头文件之一(headers.one
有没有办法查询 RavenDB 文档存储并找出陈旧索引的陈旧程度? 本质上,我想做的是将结果提供给用户,同时也让他们了解还需要完成多少索引。 这在大数据导入场景中会很好。 最佳答案 当然,你可以这样做
我有一个打开版本控制包的数据库。我进行导出,然后尝试将导出的转储导入到新创建的数据库中。我收到异常“不允许修改历史修订版”。我发现this Ayende 的问答,这是设计使然。但是,如果版本控制包已打
我在查询 RavenDB 时遇到了问题,即使是最简单的查询,可能我做错了什么,但几个小时后我就看不到它了。我用谷歌搜索了几乎所有我能想到的东西.. 我有这些实体: public class U
我使用以下日志配置在 Django 1.4 上配置了 Raven 2.0.2: 'handlers': { ... 'sentry': { 'level':'INFO'
我有一个树结构,其中的节点同时具有子指针和父指针。我在让它很好地序列化时遇到了一些问题(这将用于配置,因此它需要对操作/配置管理器有一定的可读性),并且在尝试了序列化约定和属性的不同组合之后我仍然卡住
Raven DB 可以使用哪些数据访问架构? 基本上,我想通过接口(interface)分离持久性,所以我不会将下划线存储暴露给上层。 IE。我不希望我的域看到来自 Raven DB 的 IDocum
我正在使用 raven 和 getsentry 在 django 中记录消息,但记录似乎延迟了代码的执行。例如: # ...view code tic = datetime.datetime.now(
我有这样的代码: public bool Set(IEnumerable requests) { var documentSession = _documentStore.Op
我有以下 2 个实体模型: public class Store : IModel { public string Id { get; set; }
谁能帮我加快这个查询速度?我正在使用 RavenDB 3.5.8 并且以下查询需要相当长的时间(在第一次加载时尤其如此): var query = session .Q
我正在寻找一种在 Raven DB 中生成测试数据的首选且可维护的方式。目前,我们的团队确实有办法通过 .NET 代码来做到这一点。提供了示例。 但是,我正在寻找不同的选择。请分享。 public v
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是一名优秀的程序员,十分优秀!