MCP HubMCP Hub
스킬 목록으로 돌아가기

serialize-data-formats

pjt222
업데이트됨 2 days ago
4 조회
17
2
17
GitHub에서 보기
개발apidata

정보

이 스킬은 개발자가 JSON, XML, YAML, Protobuf, MessagePack, Arrow/Parquet와 같은 다양한 형식으로 데이터를 직렬화하고 역직렬화하는 데 도움을 줍니다. 적절한 형식 선택, 인코딩/디코딩 패턴 구현, 성능 상충 관계와 상호 운용성 이해에 대한 지침을 제공합니다. API용 전송 형식 선택, 데이터 지속화, 언어 간 교환, 크기와 속도 최적화에 활용할 수 있습니다.

빠른 설치

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에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요

문서

Serialize Data Formats

Select+impl right serialization format → correct encode/decode + perf awareness.

Use When

  • Wire format for API
  • Persist structured data → disk|object storage
  • Exchange between langs
  • Optimize size|speed
  • Migrate formats

In

  • Required: Data structure (schema|example)
  • Required: Use case (API|storage|stream|analytics)
  • Optional: Perf reqs (size|speed|schema enforce)
  • Optional: Target lang|runtime constraints
  • Optional: Human readability

Do

Step 1: Select Format

FormatHuman ReadableSchemaSizeSpeedBest For
JSONYesOptional (JSON Schema)MediumMediumREST APIs, config, broad interop
XMLYesXSD, DTDLargeSlowEnterprise/legacy, SOAP, documents
YAMLYesOptionalMediumSlowConfig files, CI/CD, Kubernetes
Protocol BuffersNoRequired (.proto)SmallFastgRPC, microservices, mobile
MessagePackNoNoneSmallFastReal-time, embedded, Redis
Arrow/ParquetNoBuilt-inVery SmallVery FastAnalytics, columnar queries, data lakes

Decision tree:

  1. Human edit? → YAML (config) | JSON (data)
  2. Strict schema + fast RPC? → Protobuf
  3. Smallest wire? → MessagePack | Protobuf
  4. Columnar analytics? → Parquet
  5. In-memory interchange? → Arrow
  6. Legacy enterprise? → XML

→ Format selected w/ documented rationale.

If err: reqs conflict (human + fast) → prioritize primary use case + note tradeoff.

Step 2: JSON Serialize

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

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

# Custom encoder for non-standard types
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)

# Serialize
measurement = Measurement("sensor-01", 23.5, "celsius", datetime.now())
json_str = json.dumps(asdict(measurement), cls=CustomEncoder, indent=2)

# Deserialize
data = json.loads(json_str)
# R: JSON with jsonlite
library(jsonlite)

# Serialize
df <- data.frame(sensor_id = "sensor-01", value = 23.5, unit = "celsius")
json_str <- jsonlite::toJSON(df, auto_unbox = TRUE, pretty = TRUE)

# Deserialize
df_back <- jsonlite::fromJSON(json_str)

→ Round-trip preserves all types accurately.

If err: type lost (dates → strings) → add explicit conversion in deserialize.

Step 3: Protobuf

.proto:

syntax = "proto3";
package sensors;

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

message MeasurementBatch {
  repeated Measurement measurements = 1;
}

Gen+use:

# Generate Python code
protoc --python_out=. sensors.proto

# Generate Go code
protoc --go_out=. sensors.proto
from sensors_pb2 import Measurement, MeasurementBatch
import time

# Serialize
m = Measurement(
    sensor_id="sensor-01",
    value=23.5,
    unit="celsius",
    timestamp_ms=int(time.time() * 1000)
)
binary = m.SerializeToString()  # Compact binary

# Deserialize
m2 = Measurement()
m2.ParseFromString(binary)

→ Binary 3-10x smaller than JSON.

If err: protoc unavail → lang-native lib (betterproto Py).

Step 4: MessagePack

import msgpack
from datetime import datetime

# Custom packing for 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()}

# Serialize (smaller than JSON, faster than JSON)
packed = msgpack.packb(data, default=encode_datetime)

# Deserialize
unpacked = msgpack.unpackb(packed, object_hook=decode_datetime, raw=False)

→ Output 15-30% smaller than JSON for typical payloads.

If err: lang lacks MessagePack → fallback JSON+gzip.

Step 5: Parquet (Columnar)

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

# Create data
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")
})

# Write Parquet (columnar, compressed)
table = pa.Table.from_pandas(df)
pq.write_table(table, "measurements.parquet", compression="snappy")

# Read Parquet (can read specific columns without loading all data)
table_back = pq.read_table("measurements.parquet", columns=["sensor_id", "value"])
df_subset = table_back.to_pandas()
# R: Parquet with arrow
library(arrow)

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

# Read (with column selection — only reads selected columns from disk)
df_back <- arrow::read_parquet("measurements.parquet", col_select = c("value"))

→ Parquet 5-20x smaller than CSV for tabular.

If err: Arrow unavail → fastparquet (Py)|CSV+gzip fallback.

Step 6: Compare Perf

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")

→ Benchmarks guide format for prod.

If err: insufficient perf any format → consider compression (zstd, snappy) as orthogonal optimization.

Check

  • Format matches use case (rationale documented)
  • Round-trip preserves all types
  • Edge cases: empty, null, Unicode, large nums
  • Perf benchmarked for representative sizes
  • Err handling for malformed (graceful fail)
  • Schema documented (JSON Schema|.proto|equiv)

Traps

  • Float precision: JSON = IEEE 754 doubles. String encoding for financial.
  • Date/time: No native JSON datetime. Always document format (ISO 8601) + timezone.
  • Schema evolution: Add|remove fields can break consumers. Protobuf good; JSON needs careful versioning.
  • Binary in JSON: Base64 inflates ~33%. Binary format for binary-heavy.
  • YAML security: Parsers may exec arbitrary code via !!python/object tags. Always safe loaders.

  • design-serialization-schema — schema design, versioning, evolution
  • implement-pharma-serialisation — pharma serialisation (diff domain, same naming)
  • create-quarto-report — data output for reports

GitHub 저장소

pjt222/agent-almanac
경로: i18n/caveman-ultra/skills/serialize-data-formats
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

연관 스킬

qmd

개발

qmd는 BM25, 벡터 임베딩, 재순위화를 결합한 하이브리드 검색을 통해 로컬 파일을 색인화하고 검색할 수 있는 로컬 검색 및 색인화 CLI 도구입니다. 명령줄 사용과 Claude 통합을 위한 MCP(Model Context Protocol) 모드를 모두 지원합니다. 이 도구는 임베딩에 Ollama를 사용하고 색인을 로컬에 저장하여 터미널에서 직접 문서나 코드베이스를 검색하는 데 이상적입니다.

스킬 보기

subagent-driven-development

개발

이 스킬은 각 독립적인 작업마다 새로운 하위 에이전트를 배치하고 작업 사이에 코드 리뷰를 진행하여 구현 계획을 실행합니다. 이 리뷰 프로세스를 통해 품질 게이트를 유지하면서 빠른 반복 작업을 가능하게 합니다. 동일한 세션 내에서 대부분 독립적인 작업을 진행할 때 내장된 품질 검증과 함께 지속적인 진행을 보장하기 위해 사용하세요.

스킬 보기

mcporter

개발

mcporter 스킬은 개발자가 Claude에서 직접 Model Context Protocol(MCP) 서버를 관리하고 호출할 수 있도록 합니다. 이 스킬은 사용 가능한 서버를 나열하고, 인수를 사용해 해당 서버의 도구를 호출하며, 인증 및 데몬 생명주기를 처리하는 명령어를 제공합니다. 개발 워크플로우에서 MCP 서버 기능을 통합하고 테스트할 때 이 스킬을 사용하세요.

스킬 보기

adk-deployment-specialist

개발

이 스킬은 A2A 프로토콜을 사용하여 Vertex AI ADK 에이전트를 배포하고 오케스트레이션하며, AgentCard 검색, 작업 제출, 코드 실행 샌드박스 및 메모리 뱅크와 같은 지원 도구를 관리합니다. Python, Java 또는 Go 언어로 순차, 병렬 또는 루프 오케스트레이션 패턴을 갖춘 다중 에이전트 시스템 구축을 가능하게 합니다. Google Cloud에서 ADK 에이전트 배포 또는 에이전트 워크플로우 오케스트레이션을 요청받았을 때 사용하세요.

스킬 보기