You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对象与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:23:18