JavaScript中如何向已序列化的链表添加元素并重新序列化
链表序列化后修改再重新序列化的实现方案
你要完成新增元素后再序列化的核心是把JSON反序列化得到的普通对象,还原为SinglyLinkedList类的实例——因为JSON序列化只会保留对象的属性状态,不会保留类的原型方法(比如你用到的push),所以反序列化后直接操作普通对象是调用不到链表方法的,还原为实例后就可以正常操作。
具体实现步骤如下:
- 第一步:给你的单链表类补充静态重建方法
给SinglyLinkedList加一个fromJSON静态方法,用来把序列化后的普通对象转换为合法的链表实例,示例实现如下:
class SinglyLinkedList { // 你原来的链表构造、push、print等原有方法保持不变 constructor() { this.head = null this.length = 0 } push(val) { /* 原有实现保持不变 */ } print() { /* 原有实现保持不变 */ } // 新增静态方法,从序列化后的JSON对象重建链表 static fromJSON(serializedObj) { const list = new SinglyLinkedList() // 遍历序列化后的节点链,依次push到新链表实例 let currentNode = serializedObj.head while (currentNode) { list.push(currentNode.value) // 如果你的节点属性名是val,替换为currentNode.val即可 currentNode = currentNode.next } return list } }
- 第二步:读取文件→重建实例→修改→重新序列化存储
const fs = require('fs') // 读取文件并更新链表 fs.readFile('./test.txt', 'utf-8', (err, data) => { if (err) { console.log(err) return } // 反序列化为普通对象 const serializedList = JSON.parse(data) // 还原为SinglyLinkedList实例 const list = SinglyLinkedList.fromJSON(serializedList) // 正常调用链表方法新增元素 list.push('你要新增的内容') // 可调用print验证修改结果 list.print() // 重新序列化后写入文件 fs.writeFile('./test.txt', JSON.stringify(list), err => { if (err) console.log(err) }) })
不推荐直接修改反序列化对象的原型指向
SinglyLinkedList.prototype,这种方式虽然也能调用到方法,但如果序列化后的对象属性和类实例属性有差异时很容易出现隐式bug,通过静态方法重建实例兼容性和稳定性更好。
内容的提问来源于stack exchange,提问作者RHGPT
相关产品推荐
相关产品推荐

