mdoTomofumi Chiba
12/23/2023, 5:09:14 AM

MessagePack を使った JS オブジェクトの文字列シリアライズ・デシリアライズ

JS オブジェクトの文字列シリアライズ・デシリアライズは、MessagePack 使うとワンライナーで実現できそう。
URL に JSオブジェクトをまるっと乗せるときに使えそう。
URL が短くなってくれたら嬉しいかもしれない。

msgpack.ts

import { decode, encode } from "npm:@msgpack/msgpack";

export function serialize(object: object): string {
  return btoa(String.fromCharCode(...encode(object)));
}

export function desrialize(string: string): unknown {
  return decode(Uint8Array.from(atob(string), (x) => x.charCodeAt(0)));
}

msgpack_test.ts

import { assertEquals } from "std/testing/asserts.ts";
import { desrialize, serialize } from "./msgpack.ts";

Deno.test("serialize desrialize", () => {
  const originalObject = {
    nil: null,
    integer: 1,
    float: Math.PI,
    string: "Hello 日本語!",
    binary: Uint8Array.from([1, 2, 3]),
    array: [10, 20, 30],
    map: { foo: "bar" },
    timestampExt: new Date(),
  };

  const serialized = serialize(originalObject);
  console.log(serialized);
  const deserialized = desrialize(serialized);
  assertEquals(deserialized, originalObject);
});
$ deno test npm/msgpack_test.ts 
running 1 test from ./npm/msgpack_test.ts
serialize desrialize ...
------- output -------
iKNuaWzAp2ludGVnZXIBpWZsb2F0y0AJIftURC0YpnN0cmluZ7BIZWxsbyDml6XmnKzoqp4hpmJpbmFyecQDAQIDpWFycmF5kwoUHqNtYXCBo2Zvb6NiYXKsdGltZXN0YW1wRXh01/8KA3oAZYZqGw==
----- output end -----
serialize desrialize ... ok (3ms)

ok | 1 passed | 0 failed (5ms)

しかしながら、依存のサイズがそこそこ大きいのでフロントエンドに取り込むかは微妙。

参考



TweetBlueskyLike