javascript - 如何在 Immutable.js 中序列化数据历史以启用时间旅行?

标签 javascript immutable.js trie

对于我正在处理的 TypeScript/JavaScript 项目,我需要某种具有完全持久性的启用时间旅行的数据结构。该数据结构需要能够序列化到数据库或至少是文件系统。我希望能够将旧版本分支出来进行修改,但我不需要做任何像合并分支这样的花哨的事情。我想我需要某种 HAMT ( https://en.wikipedia.org/wiki/Hash_array_mapped_trie ),例如在 Immutable.js 中实现的。然而,我还需要能够将内部结构保存到数据库或磁盘。大多数人在比较数据结构时使用 Immutable.js,例如在确定是否更新 React 组件时,这是一个非常有用的属性。然而,我需要的是时间旅行和序列化,以便有效地存储节点并保留所有历史记录。这两个东西都是 HAMT 的属性,但是 Immutable.js 似乎不支持这一点。也许我在文档中遗漏了一些东西。 Immutable.js 可以做到这一点吗?如果没有,有人知道我可以用来完成此任务的任何库吗?我是否必须实现我自己的 HAMT?

更新:
明确地说,我需要序列化内部数据结构而不是它的表示。据我所知,这意味着我需要某种哈希表来跟踪每个节点。当我们谈论持久数据结构时,我只想序列化新节点,因为它们是在突变时写入的,我不想序列化整个数据树或它的表示。
我知道我可以简单地从 Immutable.js 获取任何操作的输出并保存该数据的序列化副本,就像我在 Redux 中使用 Redux Dev Tools 一样。问题是这会在线路上产生过多的流量并导致我们的数据存储需求爆发,在这种情况下并不是我真正需要的。

最佳答案

这里有两个问题。

How can I take advantage of time travel in Immutable.js?



Immutable.js 本身并不实现时间旅行,但库数据结构的性质(任何修改都会返回对该数据“快照”的新引用),这使得您很容易实现自己。您需要做的就是在您的数据结构上创建一个“历史容器”或包装器,它会自动将 Immutable 创建的每个新引用存储在映射中。然后您将能够撤消/重做,并在 map 上搜索特定时间。在 this free preview 中有一个使用代理的示例实现谷歌图书上 Adam Boduch 的一本书。当然,您可以根据需要对其进行修改。

How can I serialize data in Immutable.js?



JavaScript 中事实上的序列化技术是 toJSON() . Immutable.js 实现 toJSON()对于它提供的每个数据结构。来自 readme :

All Immutable.js Collections can be converted to plain JavaScript Arrays and Objects shallowly with toArray() and toObject() or deeply with toJS(). All Immutable Collections also implement toJSON() allowing them to be passed to JSON.stringify directly. They also respect the custom toJSON() methods of nested objects.



您可以通过使用 JSON.parse(data) 进行反序列化,将 JSON 转换回不可变结构。并将其传递给构造函数或使用 .fromJS()在任何不可变结构中。

关于javascript - 如何在 Immutable.js 中序列化数据历史以启用时间旅行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59972766/

相关文章:

javascript - typescript 的类型安全 Immutable.Js getIn

algorithm - 从 trie 中检索丢失的字符串

javascript - 从 'fs' 读取和写入文件不异步工作

javascript - 在 OnClick 方法上传递 PHP 变量

javascript - 带复选框的 Jquery 条件

javascript - Immutable.js map 集与更新

javascript - 如何设置默认值

c- sysmalloc 断言问题

c - 三元搜索特里树插入功能问题

javascript - 使用变量作为 `this.state` 调用 ReactJS 的一部分