返回技能列表

serialize-data-formats

pjt222
更新于 2 days ago
6 次查看
17
2
17
在 GitHub 上查看
开发apidata

关于

This skill helps developers serialize and deserialize data between common formats like JSON, XML, YAML, Protobuf, and MessagePack. It covers format selection, encoding/decoding patterns, and performance trade-offs for use cases like API communication, data persistence, and system interoperability. Use it to choose optimal wire formats, optimize transfer size/parsing speed, or migrate between serialization formats.

快速安装

Claude Code

推荐
主要方式
npx skills add pjt222/agent-almanac -a claude-code
插件命令备选方式
/plugin add https://github.com/pjt222/agent-almanac
Git 克隆备选方式
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/serialize-data-formats

在 Claude Code 中复制并粘贴此命令以安装该技能

技能文档


name: serialize-data-formats description: > JSON、XML、YAML、Protocol Buffers、MessagePack、Apache Arrow/Parquetを含む 一般的なフォーマット間でデータをシリアライズ・デシリアライズする。 フォーマット選択基準、エンコード/デコードパターン、パフォーマンスの トレードオフ、相互運用性の考慮事項をカバー。API通信のワイヤーフォーマット 選択、構造化データのディスク永続化、異なる言語で書かれたシステム間の データ交換、転送サイズや解析速度の最適化、シリアライゼーション フォーマット間の移行に使用する。 license: MIT allowed-tools: Read Write Edit Bash Grep Glob metadata: author: Philipp Thoss version: "1.0" domain: data-serialization complexity: intermediate language: multi tags: json, xml, yaml, protobuf, messagepack, parquet, arrow, serialization locale: ja source_locale: en source_commit: 6f65f316 translator: claude-sonnet-4-6 translation_date: 2026-03-16

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

ユースケースに適したデータシリアライゼーションフォーマットを選択し、正しいエンコード/デコードとパフォーマンス意識を持って実装する。

使用タイミング

  • API通信のワイヤーフォーマットを選択する場合
  • 構造化データをディスクやオブジェクトストレージに永続化する場合
  • 異なる言語で書かれたシステム間でデータを交換する場合
  • データ転送サイズや解析速度を最適化する場合
  • シリアライゼーションフォーマット間を移行する場合

入力

  • 必須: シリアライズするデータ構造(スキーマまたは例)
  • 必須: ユースケース(API、ストレージ、ストリーミング、分析)
  • 任意: パフォーマンス要件(サイズ、速度、スキーマ強制)
  • 任意: ターゲット言語/ランタイムの制約
  • 任意: 人間可読性の要件

手順

ステップ1: 適切なフォーマットの選択

フォーマット人間可読スキーマサイズ速度最適な用途
JSONはい任意(JSON Schema)REST API、設定、広範な相互運用
XMLはいXSD、DTD遅いエンタープライズ/レガシー、SOAP、文書
YAMLはい任意遅い設定ファイル、CI/CD、Kubernetes
Protocol Buffersいいえ必須(.proto)速いgRPC、マイクロサービス、モバイル
MessagePackいいえなし速いリアルタイム、組み込み、Redis
Arrow/Parquetいいえ内蔵非常に小非常に速い分析、カラムナクエリ、データレイク

決定ツリー:

  1. 人間による編集が必要? -> YAML(設定)またはJSON(データ)
  2. 厳格なスキーマ + 高速RPC? -> Protocol Buffers
  3. 最小ワイヤーサイズ? -> MessagePackまたはProtobuf
  4. カラムナ分析? -> Apache Parquet
  5. インメモリ交換? -> Apache Arrow
  6. レガシーエンタープライズ統合? -> XML

期待結果: ユースケース要件に合致する根拠を文書化してフォーマットが選択される。 失敗時: 要件が矛盾する場合(例: 人間可読かつ高速)、主要なユースケースを優先し、トレードオフを記録する。

ステップ2: JSONシリアライゼーションの実装

import json
from datetime import datetime, date
from dataclasses import dataclass, asdict

@dataclass
class Measurement:
    sensor_id: str
    value: float
    unit: str
    timestamp: datetime

# 非標準型のカスタムエンコーダ
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        if isinstance(obj, date):
            return obj.isoformat()
        if isinstance(obj, bytes):
            import base64
            return base64.b64encode(obj).decode('ascii')
        return super().default(obj)

# シリアライズ
measurement = Measurement("sensor-01", 23.5, "celsius", datetime.now())
json_str = json.dumps(asdict(measurement), cls=CustomEncoder, indent=2)

# デシリアライズ
data = json.loads(json_str)
# R: jsonliteによるJSON
library(jsonlite)

# シリアライズ
df <- data.frame(sensor_id = "sensor-01", value = 23.5, unit = "celsius")
json_str <- jsonlite::toJSON(df, auto_unbox = TRUE, pretty = TRUE)

# デシリアライズ
df_back <- jsonlite::fromJSON(json_str)

期待結果: ラウンドトリップシリアライゼーションがすべてのデータ型を正確に保持する。 失敗時: 型が失われる場合(例: 日付が文字列になる)、デシリアライゼーションステップで明示的な型変換を追加する。

ステップ3: Protocol Buffersの実装

スキーマ(.protoファイル)を定義する:

syntax = "proto3";
package sensors;

message Measurement {
  string sensor_id = 1;
  double value = 2;
  string unit = 3;
  int64 timestamp_ms = 4;  // Unixミリ秒
}

message MeasurementBatch {
  repeated Measurement measurements = 1;
}

生成して使用する:

# Pythonコードを生成
protoc --python_out=. sensors.proto

# Goコードを生成
protoc --go_out=. sensors.proto
from sensors_pb2 import Measurement, MeasurementBatch
import time

# シリアライズ
m = Measurement(
    sensor_id="sensor-01",
    value=23.5,
    unit="celsius",
    timestamp_ms=int(time.time() * 1000)
)
binary = m.SerializeToString()  # コンパクトなバイナリ

# デシリアライズ
m2 = Measurement()
m2.ParseFromString(binary)

期待結果: バイナリ出力が同等のJSONより3-10倍小さい。 失敗時: protocが利用できない場合、言語ネイティブのprotobufライブラリ(例: Pythonのbetterproto)を使用する。

ステップ4: MessagePackの実装

import msgpack
from datetime import datetime

# datetimeのカスタムパッキング
def encode_datetime(obj):
    if isinstance(obj, datetime):
        return {"__datetime__": True, "s": obj.isoformat()}
    return obj

def decode_datetime(obj):
    if "__datetime__" in obj:
        return datetime.fromisoformat(obj["s"])
    return obj

data = {"sensor_id": "sensor-01", "value": 23.5, "ts": datetime.now()}

# シリアライズ(JSONより小さく、JSONより速い)
packed = msgpack.packb(data, default=encode_datetime)

# デシリアライズ
unpacked = msgpack.unpackb(packed, object_hook=decode_datetime, raw=False)

期待結果: MessagePack出力が一般的なペイロードでJSONより15-30%小さい。 失敗時: 言語がMessagePackをサポートしない場合、圧縮付きJSON(gzip)にフォールバックする。

ステップ5: Apache Parquet(カラムナ)の実装

import pyarrow as pa
import pyarrow.parquet as pq
import pandas as pd

# データ作成
df = pd.DataFrame({
    "sensor_id": ["s-01", "s-02", "s-01", "s-03"] * 1000,
    "value": [23.5, 18.2, 24.1, 19.8] * 1000,
    "unit": ["celsius"] * 4000,
    "timestamp": pd.date_range("2025-01-01", periods=4000, freq="min")
})

# Parquet書き込み(カラムナ、圧縮)
table = pa.Table.from_pandas(df)
pq.write_table(table, "measurements.parquet", compression="snappy")

# Parquet読み込み(全データをロードせずに特定カラムを読み取れる)
table_back = pq.read_table("measurements.parquet", columns=["sensor_id", "value"])
df_subset = table_back.to_pandas()
# R: arrowによるParquet
library(arrow)

# 書き込み
df <- data.frame(sensor_id = rep("s-01", 1000), value = rnorm(1000))
arrow::write_parquet(df, "measurements.parquet")

# 読み込み(カラム選択付き — 選択されたカラムのみディスクから読み込む)
df_back <- arrow::read_parquet("measurements.parquet", col_select = c("value"))

期待結果: Parquetファイルが一般的な表形式データでCSVより5-20倍小さい。 失敗時: Arrowが利用できない場合、fastparquet(Python)またはgzip付きCSVをフォールバックとして使用する。

ステップ6: パフォーマンスの比較

特定のデータとユースケースでベンチマークを実行する:

import json, msgpack, time
import pyarrow as pa, pyarrow.parquet as pq

data = [{"id": i, "value": i * 0.1, "label": f"item-{i}"} for i in range(10000)]

# JSON
start = time.perf_counter()
json_bytes = json.dumps(data).encode()
json_time = time.perf_counter() - start

# MessagePack
start = time.perf_counter()
msgpack_bytes = msgpack.packb(data)
msgpack_time = time.perf_counter() - start

print(f"JSON:    {len(json_bytes):>8} bytes, {json_time*1000:.1f} ms")
print(f"MsgPack: {len(msgpack_bytes):>8} bytes, {msgpack_time*1000:.1f} ms")

期待結果: ベンチマーク結果が本番使用のフォーマット選択を導く。 失敗時: いずれのフォーマットでもパフォーマンスが不十分な場合、圧縮(zstd、snappy)を直交する最適化として検討する。

バリデーション

  • 選択したフォーマットがユースケース要件に合致する(根拠が文書化されている)
  • ラウンドトリップシリアライゼーションがすべてのデータ型を保持する
  • エッジケースが処理される: 空コレクション、null/None値、Unicode、大きな数値
  • 代表的なペイロードサイズでパフォーマンスがベンチマークされている
  • 不正入力のエラーハンドリング(クラッシュではなく優雅な失敗)
  • スキーマが文書化されている(JSON Schema、.proto、または同等物)

よくある落とし穴

  • 浮動小数点精度: JSONはすべての数値をIEEE 754倍精度で表現する。金融/10進数精度には文字列エンコーディングを使用する。
  • 日付/時刻処理: JSONにはネイティブのdatetime型がない。フォーマット(ISO 8601)とタイムゾーン処理を常に文書化する。
  • スキーマ進化: フィールドの追加や削除はコンシューマーを壊す可能性がある。Protobufはこれをうまく処理する; JSONには慎重なバージョニングが必要。
  • JSONでのバイナリデータ: Base64エンコーディングはバイナリデータを約33%膨張させる。バイナリ重視のペイロードにはバイナリフォーマットを使用する。
  • YAMLのセキュリティ: YAMLパーサーは!!python/objectタグで任意のコードを実行する場合がある。常にセーフローダーを使用する。

関連スキル

  • design-serialization-schema — スキーマ設計、バージョニング、進化戦略
  • implement-pharma-serialisation — 医薬品シリアライゼーション(異なるドメイン、同じ名称)
  • create-quarto-report — レポート用データ出力フォーマッティング

GitHub 仓库

pjt222/agent-almanac
路径: i18n/ja/skills/serialize-data-formats
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

相关推荐技能

qmd

开发

这是一个本地搜索和索引的CLI工具,支持BM25、向量搜索和重排序功能。开发者可以用它快速索引本地文件(如Markdown文档)并进行混合搜索,特别适合代码库或文档的本地检索。它还提供MCP模式,能轻松集成到Claude开发环境中使用。

查看技能

subagent-driven-development

开发

该Skill用于在当前会话中执行包含独立任务的实施计划,它会为每个任务分派一个全新的子代理并在任务间进行代码审查。这种"全新子代理+任务间审查"的模式既能保障代码质量,又能实现快速迭代。适合需要在当前会话中连续执行独立任务,并希望在每个任务后都有质量把关的开发场景。

查看技能

mcporter

开发

mcporter Skill 让开发者能在Claude中直接管理和调用MCP服务器。它支持列出可用服务器、调用工具、处理OAuth认证以及管理服务器守护进程。开发者可以通过命令行式交互快速执行`mcporter list`查看服务器,或使用`mcporter call`直接调用工具,简化了MCP工作流程。

查看技能

adk-deployment-specialist

开发

这是一个用于部署和编排Google Vertex AI ADK智能体的Claude Skill,专为构建生产级多智能体系统而设计。它支持通过A2A协议进行智能体通信,提供代码执行沙箱和记忆库功能,并能处理智能体发现与任务提交。当开发者需要部署ADK智能体或编排多智能体协作时,可使用此Skill来简化Vertex AI Agent Engine的部署流程。

查看技能