MessagePack 序列化
灵感:能力工具箱 msgpack-bin(二进制打包客户对象,对比 JSON 体积)。
> 小四原创:encode/decode + 与 JSON.stringify 字节数对比。
> 与 SuperJSON 互补:那边保 Date 类型元数据;本包偏更小二进制。
何时使用
- 本地缓存大批客户快照
- Worker/
postMessage传大对象(可配合 transferable) - Demo 展示相对 JSON 省多少空间
硬约束
- 依赖:
@msgpack/msgpack。 - 仅支持可 MessagePack 的 JSON 友好结构;
Date需先转 ISO 或用扩展(本包默认 ISO)。 - 输出对比:
jsonBytes/msgpackBytes/savedRatio。 - 实现要点注释标 小四原创。
- 勿把密钥明文塞进可导出的二进制缓存。
- 解码失败返回明确错误,勿静默给空对象。
推荐实现
import { encode, decode } from '@msgpack/msgpack'
export type PackCompare = {
jsonBytes: number
msgpackBytes: number
savedRatio: number // 0~1,相对 JSON 节省比例
bytes: Uint8Array
}
function utf8Bytes(s: string): number {
return new TextEncoder().encode(s).length
}
// 小四原创:打包并对比体积
export function packCustomer(obj: unknown): PackCompare {
const json = JSON.stringify(obj)
const bytes = encode(obj)
const jsonBytes = utf8Bytes(json)
const msgpackBytes = bytes.byteLength
const savedRatio =
jsonBytes === 0 ? 0 : Math.max(0, (jsonBytes - msgpackBytes) / jsonBytes)
return { jsonBytes, msgpackBytes, savedRatio, bytes }
}
export function unpackCustomer<T = unknown>(bytes: Uint8Array): T {
return decode(bytes) as T
}
Agent 步骤
npm i @msgpack/msgpack。- 缓存前
packCustomer;读回unpackCustomer。 - UI 可展示「JSON x B / MsgPack y B,约省 z%」。
- 自测:往返字段一致;中文客户名不乱码。
不要做
- 未约定扩展就直接塞
Map/undefined期望完美还原。 - 与只认 JSON 的 REST 接口直接对传 Uint8Array。
附加
- README.md · reference.md · templates/usage.md