对象与Buffer互转及Chunk包装后无法还原原对象问题求助
问题描述
我有一段时间序列数据,先将其转为Buffer并分割成块。现在需要给每个块添加requestId这类额外数据,转成Buffer后存入converted变量,但无法从converted还原出原对象。
原始分割Buffer代码(可正常还原)
const result = [ { // 这是示例数据,实际可能包含多个对象 "name": "object1", "id": "1", "timeseriesData": [ [ 1548979200000, // 毫秒级时间戳 325.3 // 数值 ], [ 1548979260000, 325.8 ], [ 1548979320000, 324.2 ], [ 1548979380000, 323.7 ], [ 1548979440000, 322.3 ], [ 1548979500000, 322 ] ] }, { "name": "object2", "id": "2", "timeseriesData": [ [ 1548989200000, 625.3 ], [ 1548989260000, 625.8 ], [ 1548989320000, 624.2 ], [ 1548989380000, 623.7 ], [ 1548989440000, 622.3 ], [ 1548989500000, 622 ] ] } ] const splitInChunks = (sizeInBytes) => // 分割Buffer的工具函数 (buffer) => { console.log(buffer); const size = Buffer.byteLength(buffer.buffer); let start = 0; let end = sizeInBytes; const chunks = []; do { chunks.push(buffer.subarray(start, end)); start += sizeInBytes; end += sizeInBytes; } while (start < size); return chunks; }; const chunks = splitInChunks(32)(Buffer.from(JSON.stringify(result))); console.log("块数量", chunks.length) console.log('第一个块-', chunks[0]) console.log(JSON.parse(Buffer.concat(chunks))) // 此处可正常还原原对象
出现问题的代码(添加额外数据后无法还原)
const converted = chunks.map(c=> Buffer.from(JSON.stringify({requestId:"123", buf: c}))); console.log("转换后的块数量", converted.length) const result1 = []; for (let con of converted) { const eachChunkBuf = JSON.parse(con); result1.push(eachChunkBuf.buf) } console.log('result1', result1) console.log(JSON.parse(Buffer.concat(result1))) // 期望输出原对象但失败
问题原因
直接将Buffer对象传入JSON.stringify时,JSON会把它序列化成{ type: 'Buffer', data: [二进制数值数组] }的对象结构,而非原始二进制数据。后续JSON.parse得到的是这个普通对象,不是Buffer实例,用Buffer.concat拼接这些对象自然无法还原出原始JSON字符串,也就无法解析原对象。
解决方案
需要将Buffer块转为可被JSON正确序列化/反序列化的格式,推荐两种方式:
方案1:Base64编码(兼容性最优)
// 转换时:将Buffer转为Base64字符串 const converted = chunks.map(c => Buffer.from(JSON.stringify({ requestId: "123", buf: c.toString('base64') // 转成Base64格式 }))); console.log("转换后的块数量", converted.length) const result1 = []; for (let con of converted) { const eachChunk = JSON.parse(con); // 反序列化时:将Base64字符串转回Buffer result1.push(Buffer.from(eachChunk.buf, 'base64')); } console.log(JSON.parse(Buffer.concat(result1))) // 可正常还原原对象
方案2:利用Buffer的toJSON结构
// 转换时:直接使用Buffer的toJSON方法生成可序列化结构 const converted = chunks.map(c => Buffer.from(JSON.stringify({ requestId: "123", buf: c.toJSON() }))); console.log("转换后的块数量", converted.length) const result1 = []; for (let con of converted) { const eachChunk = JSON.parse(con); // 反序列化时:从toJSON结构还原Buffer result1.push(Buffer.from(eachChunk.buf)); } console.log(JSON.parse(Buffer.concat(result1))) // 可正常还原原对象
说明
- Base64方案兼容性更强,适合跨环境传输场景;
- 利用
toJSON的方式更贴近Buffer原生结构,本质也是将二进制数据转为可序列化格式。
内容的提问来源于stack exchange,提问作者micronyks
相关产品推荐
相关产品推荐

