最終曎新:

シリアラむズの仕組み — 買い物メモを保存しお、読み戻す


名前ず数量は戻る、日付の型は倉わる

プログラム内のメモりんご × 2名前ず数量2026-01-01日付のオブゞェクトDateJSON → UTF-8 → 読み戻し衚せるデヌタだけを枡すJSONを読み戻した倀りんご × 2名前ず数量2026-01-01文字列string日付型には、自動で戻らない目的の型ず倀を怜蚌する
本文のJavaScriptの䟋です。矢印の文字は倉換順で、ネットワヌク送信やファむル保存は行っおいたせん。圢匏が衚せるものず倉換芏則を確認したす。
ひよこ ひよこ
買い物メモを、別のプログラムぞ枡すには
ペンギン先生 ペンギン先生
プログラム内のデヌタを、保存や送信できる圢匏ぞ倉えるのがシリアラむズだよ。JSONの文字列ぞ倉換し、UTF-8のバむト列にする䟋から芋おみよう。読み戻すのがデシリアラむズだね。
ひよこ ひよこ
JSONなら、芋た目は文字だよね
ペンギン先生 ペンギン先生
そうだね。テキスト圢匏だけど、ファむルや通信では文字コヌドに応じたバむトずしお扱う。文字列を䜜るこずず、ファむルぞ保存するこず、通信するこずも、それぞれ別の操䜜なんだ。
ひよこ ひよこ
読み戻したら、元のものず党郚同じ
ペンギン先生 ペンギン先生
圢匏で衚せるデヌタず倉換の芏則によるよ。JavaScriptのDateはJSONでは文字列になり、読み戻しおもDateぞ自動的には戻らない。関数や埪環参照も、そのたた䜕でも保存できるわけではないんだ。
ひよこ ひよこ
バむナリなら、い぀でも小さくお速いの
ペンギン先生 ペンギン先生
デヌタの内容やラむブラリ、圧瞮、環境によるよ。ProtobufやMessagePack等は候補だけど、JSONの䜕分の1・䜕倍ず固定で比べるのは避けよう。人が確認する必芁や察応蚀語も刀断材料になるんだ。
ひよこ ひよこ
Protobufの番号は、䜕のため
ペンギン先生 ペンギン先生
各フィヌルドを識別する番号だよ。.protoで型ず番号を決め、コヌドを生成しお䜿う。䜿い始めた番号を倉えたり、削陀した番号を別の甚途に䜿ったりするず、読み手が意味を取り違えるおそれがあるんだ。
ひよこ ひよこ
番号さえ同じなら、曎新しおも絶察倧䞈倫
ペンギン先生 ペンギン先生
番号は倧切だけど、それだけではないよ。型の倉曎や存圚の扱い、JSONぞ倉える経路なども条件になる。新しいフィヌルドの远加をバむナリ䞊で読めおも、アプリが必芁な倀を䜿えるかは別に確認しよう。
ひよこ ひよこ
読み戻すだけでも、危険があるの
ペンギン先生 ペンギン先生
圢匏によるよ。Pythonのpickle等は、信頌できないデヌタの読み蟌みでコヌドを実行され埗る。JSONを䜿う堎合も、倧きさや構造、必芁な型・倀を怜蚌しおから䜿う。圢匏だけで入力が信甚できるわけではないんだ。
ひよこ ひよこ
初心者は、どこから芚えればいい
ペンギン先生 ペンギン先生
たず倀→衚珟→読み戻した倀の3぀を分けよう。䞋のJSONの䟋で名前ず数量は戻り、日付は文字列になるずころを確かめるず、圢匏が残すものず残さないものが芋えおくるよ。

たずは、買い物メモをJSONにする

別のアプリぞ倀を枡すずき、プログラム内のデヌタを共通の衚珟ぞ倉えたす。Node.jsがあればserialize-demo.jsずしお保存し、node serialize-demo.jsで詊しおみたしょう。

const memo = {
  name: "りんご",
  quantity: 2,
  createdAt: new Date("2026-01-01T00:00:00Z"),
};
const json = JSON.stringify(memo);
const bytes = new TextEncoder().encode(json);
const restored = JSON.parse(new TextDecoder().decode(bytes));

console.log(json);
console.log(restored.name, restored.quantity);
console.log(typeof restored.createdAt);
{"name":"りんご","quantity":2,"createdAt":"2026-01-01T00:00:00.000Z"}
りんご 2
string

JSON.stringifyは文字列を䜜り、TextEncoderはUTF-8のバむト列ぞ倉換したす。読み戻すず名前ず数量は䜿えたすが、日付はDateオブゞェクトではなく文字列です。図の矢印はこの倉換で、ネットワヌク通信やファむル保存を行う䟋ではありたせん。

圢匏で衚せるものを確認する

JavaScriptのJSON倉換では、オブゞェクト内のundefinedや関数などは省かれ、配列内ではnullになる堎合がありたす。通垞のBigIntや埪環参照ぱラヌになりたす。MapやSet、クラスの振る舞い等も元のたた保存できるず考えたせん。

読み戻した日時をDateにするなら、期埅する文字列か怜蚌しおから倉換したす。JSONの構文が正しいこずず、必芁な項目があり、数量が蚱す倀であるこずは別です。

テキスト・バむナリ・スキヌマの圹割

芳点遞ぶずきの問い
人が読む通信や保存の内容を目で確認したいか
スキヌマ型やフィヌルドの契玄をどこで管理するか
倧きさず速床実際のデヌタ・圧瞮・実装でどうなるか
察応環境送り手ず読み手の蚀語や版が扱えるか

JSON、Protobuf、MessagePack等で特性は違いたす。「Protobufはい぀でもJSONの1/5で10倍速い」のような数倀だけで決めず、同じ条件の実デヌタで枬りたす。

もう少し詳しくProtobufの倉曎ず入力の安党性

Protobufはフィヌルド番号でデヌタを識別したす。䜿い始めた番号を倉えず、削陀した番号はreservedで再利甚を防ぎたす。バむナリ䞊で安党な倉曎ず、条件付きの倉曎、JSON/TextFormatの条件は分けお公匏の互換性芏則を確認したす。

未知のフィヌルドを扱えるこずだけで、アプリの意味たで互換になるずは限りたせん。旧クラむアントの振る舞い、既定倀、存圚の有無、倉曎する順番もテストしたす。

Pythonのpickleは、信頌できない入力から任意のコヌドを実行される危険があるため、公匏資料も信甚できるデヌタだけを読み蟌むよう案内しおいたす。JSONやProtobufを遞んでも、入力の量・型・倀・甚途の怜査ず認可は必芁です。

🐧 ペンギン先生のたずめ「シリアラむズ」っお出おきたら「倀を、保存や送信に䜿える衚珟ぞ詰めるこず」ず思えばだいたいOK

送り方はgRPCの仕組み、APIの入口はAPI開発入門で続けられたす。

参考資料

  • MDNJSON.stringify — Date・省略する倀・埪環参照ずBigIntの条件
  • Protocol Buffersproto3 guide — フィヌルド番号・reserved・倉曎の互換性の区分
  • Pythonpickle — 信頌できないデヌタの読み蟌みずコヌド実行の危険