ネットワーキング
 Computer >> コンピューター >  >> ネットワーキング >> ネットワーキング

シリアライズ(直列化)とは?仕組みからマーシャリングとの違い、活用例まで徹底解説

最近のプロジェクト進捗ミーティングで、私たちのチームは「シリアライズ(直列化)」を使ってアプリケーション間でデータをやり取りする方法について話し合いました。

すると、ソフトウェア開発にもっと携わりたいというエンジニアから、「その用語はよく知らない」という声が上がりました。

こうした重要なプロセスは、規模の大きいプロジェクトに踏み込むまで登場しないため、見落とされがちです。この方にとってはそうでしたし、かつての私自身もまったく同じでした。

そこで、この記事を書くことにしました。あの日同僚にシリアライズについて教えたように、今日はあなたにその知識をお伝えします。

シリアライズとは何か?

シリアライズとは、あるサービスがPythonの辞書型のようなデータ構造を受け取り、それをひとまとめにして、別のサービスへ読み取り用に送信するプロセスです。これが最もシンプルな定義です。

例えてみましょう。誰かにメッセージを送りたいとします。そこで、すでに組み立てられたパズルにメッセージを書き込みます。次にパズルをバラバラに分解し、組み立て方の手順書を添えて送ります。

受け取った人はパズルのピースをすべて組み立て直せば、メッセージを読めるというわけです。

シリアライズ(直列化)とは?仕組みからマーシャリングとの違い、活用例まで徹底解説
シリアライズの基本的な流れ

技術的な定義はもう少し興味深いものになります。シリアライズとは、データオブジェクトをバイトストリームに変換し、オブジェクトの状態をディスクへの保存やネットワーク経由の転送が可能な形で保持するプロセスのことです。これにより必要なストレージ容量が削減され、ネットワーク上での情報伝達も格段に容易になります。

シリアライズ(直列化)とは?仕組みからマーシャリングとの違い、活用例まで徹底解説
シリアライズのプロセス

マーシャリングとシリアライズの違いは?

ここで「マーシャリング」というプロセスを思い浮かべる方もいるでしょう。マーシャリングとは、オブジェクトのメモリ上の表現を、転送に適した形式へ変換するプロセスです。

マーシャリングとシリアライズは緩やかに同意語として使われますが、重要な違いがあります。たとえば、JSONデータをGolangのデータ構造に読み込むプログラムを作る場合、マーシャリングを使ってJSONのキー値をGolangのキー値へ翻訳できます。

違いはこうです。マーシャリングはデータの翻訳に使われることがあります。一方、シリアライズはデータをバイトストリームとして送信・保存し、元の形式に再構成します。どちらもシリアライズを行いますが、2つのプロセスには意図の違いがあるのです。

以下は、Twitterデータを扱うために私が作成した構造体の例で、マーシャリングの実際の動作を確認できます。Golangではタグと呼ばれるヒントを付与でき、Golangの組み込みマーシャリング機能を使えば、このオブジェクトを簡単にJSONデータへ変換できます。

シリアライズ(直列化)とは?仕組みからマーシャリングとの違い、活用例まで徹底解説
JSONタグを使用したGolangの構造体

エンディアンとは?

エンディアンについても軽く触れておきましょう。エンディアンとは、メモリ内のバイト順序を表す用語です。

メモリはデータのバイトが格納されるブロックだと考えることができます。シリアライズが正しく機能するには、システム間でエンディアンが異なっても、バイトストリームがデータ型を正しく転送できる必要があります。

下図はリトルエンディアンとビッグエンディアンの違いを示したものです。すべてのシステムが同じ方法でビットを並べているわけではないため、システム間でエンディアンを揃えるか、何らかの方法で変換することが極めて重要です。

シリアライズ(直列化)とは?仕組みからマーシャリングとの違い、活用例まで徹底解説
リトルエンディアンとビッグエンディアン(出典:https://pvs-studio.com/en/blog/lessons/0019/)

シリアライズのユースケース

私たちのユースケースでは、これらの特徴を最大限に活用しています。スキャン対象のハードウェアから情報を受け取り、その情報をバイトストリームにパッケージ化して、ネットワーク経由で別のサービスへ送信します。そして、そのサービス側でデータを再構成する仕組みです。

シリアライズの逆のプロセス、つまりデータを元の形式へ復元することをデシリアライズと呼びます。

その他のユースケースもあります。たとえば、REST APIやAMQPのようなメッセージングプロトコルは、シリアライズを使ってデータを圧縮・送信できます。

AMQPはメッセージングプロトコルの一種で、AMQPブローカーにメッセージを送信し、受信側のサービスがそのブローカーを「リスニング」してメッセージを待ち受けます。分散システム内でデータをやり取りする際によく使われるため、バックエンドエンジニアには馴染み深いでしょう。

多くのプログラミング言語には、シリアライズを手軽に行うための機能が備わっています。つまり、言語に依存しない普遍的なトピックなのです。

シリアライズのコード例

簡単な例を見てみましょう。以下のコードは、kombuライブラリーを使ってAMQP経由でメッセージを送信するものです。ネットワーク越しに、あるソフトウェアパッケージから別のパッケージへメッセージを送るために使用しています。これはAMQPブローカーへメッセージを送信するサービスのコードです:

def send_message(self, payload, sender_serializer):
...
    try:
        producer.publish(
            {'payload': message},
            ...
            serializer = 'json',
            ...
        )
        return

publishメソッドに注目してください。渡すデータをどうシリアライズするかをライブラリーが判断できるよう、シリアライズ方式を引数として渡しています。

データメッセージはバイトストリームへ変換されます。中身を覗いてみると、ただの長い文字と数字の羅列にしか見えませんが、これでメッセージを送信します。

対応するサービス側では、同じシリアライズ方式を使ってデータを元の状態に再構成します。これは非常に重要な特徴です。私たちが開発しているのは、互いにメッセージを送り合って初めて機能するツール群だからです。

シリアライズのデータフォーマット

私は、タスクに応じて必要な場面ではJSONをシリアライズに使用しています。しかし、選択肢は他にもあります。

JSONはオーバーヘッドが大きめですが、人間が読みやすい点が大きな魅力です。そのほか、Protobuf、YAML、XMLなども利用できます。これらは使えるデータオブジェクトフォーマットのほんの一例にすぎません。

まとめ

頭の中に溜めていたこれらの知識を書き出せて良かったです。これで考え続けずに済みますし、誰かの学びになれば嬉しい限りです。

通信パイプラインを構築する際、シリアライズは不可欠な存在になります。適切な背景知識を持っていれば、どんなツールに向き合うときでも自信を持って取り組めるはずです。

-George

  1. データセンターとは?仕組み・用途・セキュリティ対策をわかりやすく解説

    データセンターとはデータセンターとは、大量のコンピュータサーバーや関連機器を収容するために設けられた専用施設のことです。英語では「data center」と表記するのが一般的ですが、「datacenter」と一語で書かれることもあります。イメージとしては、「壁からはみ出してしまったコンピュータ室」のようなものです。データセンターには、企業ユーザーのメール、財務記録、ウェブサイトのデータなど、あらゆる種類のデータを保存することができます。データセンターは何に使われるのか?一部のオンラインサービスは規模が非常に大きく、1〜2台のサーバーでは運用できません。そうしたサービスでは、サービスを動かすため

  2. STREAMアルゴリズムとは?データストリームk-mediansクラスタリングの仕組みと課題を解説

    STREAMアルゴリズムの概要 STREAMは、k-medians問題(k-中央値クラスタリング)のために開発された、シングルパス(1回の走査)による定数倍近似アルゴリズムです。k-medians問題とは、N個のデータポイントをk個のクラスタ(グループ)に分割し、各ポイントとそれが割り当てられたクラスタ中心との間の二乗誤差の合計(SSQ:Sum of Squared Error)を最小化する問題を指します。その狙いは、互いに類似したデータポイントを同じクラスタにまとめ、他のクラスタに属するポイントとは区別することにあります。 ストリームデータモデルにおける制約 ストリームデータモデルでは、デ