MCP HubMCP Hub
Retour aux compétences

serialize-data-formats

pjt222
Mis à jour 2 days ago
1 vues
17
2
17
Voir sur GitHub
Communicationdata

À propos

Cette compétence permet la sérialisation et la désérialisation de données à travers des formats tels que JSON, XML, YAML, Protocol Buffers, MessagePack, et Apache Arrow/Parquet. Elle aide les développeurs à choisir le format approprié et à mettre en œuvre les modèles corrects d'encodage/décodage pour des cas d'usage comme la communication d'API ou le stockage de données. Les conseils incluent les compromis de performance et les considérations d'interopérabilité.

Installation rapide

Claude Code

Recommandé
Principal
npx skills add pjt222/agent-almanac -a claude-code
Commande PluginAlternatif
/plugin add https://github.com/pjt222/agent-almanac
Git CloneAlternatif
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/serialize-data-formats

Copiez et collez cette commande dans Claude Code pour installer cette compétence

Documentation


name: serialize-data-formats description: > Daten ueber gaengige Formate serialisieren und deserialisieren, darunter JSON, XML, YAML, Protocol Buffers, MessagePack und Apache Arrow/Parquet. Umfasst Formatauswahlkriterien, Kodierungs-/Dekodierungsmuster, Performance-Abwaegungen und Interoperabilitaetsueberlegungen. 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: de source_locale: en source_commit: 6f65f316 translator: claude-sonnet-4-6 translation_date: 2026-03-16

Datenformate serialisieren

Das richtige Datenserialisierungsformat fuer den Anwendungsfall auswaehlen und implementieren, mit korrekter Kodierung/Dekodierung und Performance-Bewusstsein.

Wann verwenden

  • Ein Wire-Format fuer API-Kommunikation waehlen
  • Strukturierte Daten auf Festplatte oder Objektspeicher persistieren
  • Daten zwischen Systemen austauschen, die in verschiedenen Sprachen geschrieben sind
  • Datenuebertragungsgroesse oder Parsing-Geschwindigkeit optimieren
  • Von einem Serialisierungsformat zu einem anderen migrieren

Eingaben

  • Erforderlich: Zu serialisierende Datenstruktur (Schema oder Beispiel)
  • Erforderlich: Anwendungsfall (API, Speicherung, Streaming, Analytik)
  • Optional: Performance-Anforderungen (Groesse, Geschwindigkeit, Schema-Durchsetzung)
  • Optional: Zielsprache/Laufzeitbeschraenkungen
  • Optional: Anforderungen an menschliche Lesbarkeit

Vorgehensweise

Schritt 1: Das richtige Format waehlen

FormatMenschenlesbarSchemaGroesseGeschw.Am besten fuer
JSONJaOptional (JSON Schema)MittelMittelREST-APIs, Konfig, breite Interop
XMLJaXSD, DTDGrossLangsamEnterprise/Legacy, SOAP, Dokumente
YAMLJaOptionalMittelLangsamKonfigdateien, CI/CD, Kubernetes
Protocol BuffersNeinErforderlich (.proto)KleinSchnellgRPC, Microservices, Mobil
MessagePackNeinKeinesKleinSchnellEchtzeit, Embedded, Redis
Arrow/ParquetNeinEingebautSehr KleinSehr SchnellAnalytik, spaltenbasierte Abfragen, Data Lakes

Entscheidungsbaum:

  1. Menschliche Bearbeitung noetig? -> YAML (Konfig) oder JSON (Daten)
  2. Striktes Schema + schnelles RPC noetig? -> Protocol Buffers
  3. Kleinste Wire-Groesse noetig? -> MessagePack oder Protobuf
  4. Spaltenbasierte Analytik noetig? -> Apache Parquet
  5. In-Memory-Austausch noetig? -> Apache Arrow
  6. Legacy-Enterprise-Integration? -> XML

Erwartet: Format mit dokumentierter Begruendung ausgewaehlt, die den Anforderungen des Anwendungsfalls entspricht. Bei Fehler: Falls Anforderungen konfligieren (z.B. menschenlesbar UND schnell), den primaeren Anwendungsfall priorisieren und den Kompromiss dokumentieren.

Schritt 2: JSON-Serialisierung implementieren

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

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

# Benutzerdefinierter Encoder fuer Nicht-Standardtypen
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)

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

# Deserialisieren
data = json.loads(json_str)
# R: JSON mit jsonlite
library(jsonlite)

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

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

Erwartet: Roundtrip-Serialisierung bewahrt alle Datentypen akkurat. Bei Fehler: Falls ein Typ verloren geht (z.B. Daten werden zu Strings), explizite Typkonvertierung im Deserialisierungsschritt hinzufuegen.

Schritt 3: Protocol Buffers implementieren

Schema (.proto-Datei) definieren:

syntax = "proto3";
package sensors;

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

message MeasurementBatch {
  repeated Measurement measurements = 1;
}

Generieren und verwenden:

# Python-Code generieren
protoc --python_out=. sensors.proto

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

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

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

Erwartet: Binaerausgabe 3-10x kleiner als aequivalentes JSON. Bei Fehler: Falls protoc nicht verfuegbar ist, eine sprachspezifische Protobuf-Bibliothek verwenden (z.B. betterproto fuer Python).

Schritt 4: MessagePack implementieren

import msgpack
from datetime import datetime

# Benutzerdefiniertes Packen fuer 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()}

# Serialisieren (kleiner als JSON, schneller als JSON)
packed = msgpack.packb(data, default=encode_datetime)

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

Erwartet: MessagePack-Ausgabe ist 15-30% kleiner als JSON fuer typische Nutzlasten. Bei Fehler: Falls eine Sprache keine MessagePack-Unterstuetzung hat, auf JSON mit Komprimierung (gzip) zurueckfallen.

Schritt 5: Apache Parquet (spaltenbasiert) implementieren

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

# Daten erstellen
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 schreiben (spaltenbasiert, komprimiert)
table = pa.Table.from_pandas(df)
pq.write_table(table, "measurements.parquet", compression="snappy")

# Parquet lesen (kann bestimmte Spalten lesen ohne alle Daten zu laden)
table_back = pq.read_table("measurements.parquet", columns=["sensor_id", "value"])
df_subset = table_back.to_pandas()
# R: Parquet mit arrow
library(arrow)

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

# Lesen (mit Spaltenauswahl -- liest nur ausgewaehlte Spalten von der Festplatte)
df_back <- arrow::read_parquet("measurements.parquet", col_select = c("value"))

Erwartet: Parquet-Dateien 5-20x kleiner als CSV fuer typische tabellarische Daten. Bei Fehler: Falls Arrow nicht verfuegbar ist, fastparquet (Python) oder CSV mit gzip als Fallback verwenden.

Schritt 6: Performance vergleichen

Benchmarks fuer die spezifischen Daten und den Anwendungsfall ausfuehren:

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

Erwartet: Benchmark-Ergebnisse leiten die Formatauswahl fuer den Produktionseinsatz. Bei Fehler: Falls die Performance fuer kein Format ausreicht, Komprimierung (zstd, snappy) als orthogonale Optimierung in Betracht ziehen.

Validierung

  • Ausgewaehltes Format passt zu Anwendungsfallanforderungen (dokumentierte Begruendung)
  • Roundtrip-Serialisierung bewahrt alle Datentypen
  • Grenzfaelle behandelt: leere Sammlungen, null/None-Werte, Unicode, grosse Zahlen
  • Performance fuer repraesentative Nutzlastgroessen gemessen
  • Fehlerbehandlung fuer fehlerhaften Input (graceful Failures, keine Abstuerze)
  • Schema dokumentiert (JSON Schema, .proto oder Aequivalent)

Haeufige Fehler

  • Gleitkomma-Praezision: JSON stellt alle Zahlen als IEEE 754 Doubles dar. String-Kodierung fuer finanzielle/dezimale Praezision verwenden.
  • Datum/Zeit-Behandlung: JSON hat keinen nativen Datetime-Typ. Format (ISO 8601) und Zeitzonen-Behandlung immer dokumentieren.
  • Schema-Evolution: Hinzufuegen oder Entfernen von Feldern kann Konsumenten brechen. Protobuf handhabt dies gut; JSON erfordert sorgfaeltige Versionierung.
  • Binaerdaten in JSON: Base64-Kodierung blaest Binaerdaten um ~33% auf. Ein Binaerformat fuer binaer-lastige Nutzlasten verwenden.
  • YAML-Sicherheit: YAML-Parser koennen ueber !!python/object-Tags beliebigen Code ausfuehren. Immer sichere Loader verwenden.

Verwandte Skills

  • design-serialization-schema -- Schema-Design, Versionierung und Evolutionsstrategien
  • implement-pharma-serialisation -- Pharmazeutische Serialisierung (andere Domaene, gleiche Benennung)
  • create-quarto-report -- Datenausgabeformatierung fuer Berichte

Dépôt GitHub

pjt222/agent-almanac
Chemin: i18n/de/skills/serialize-data-formats
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

Compétences associées

himalaya-email-manager

Communication

Cette Compétence Claude permet la gestion d'emails via l'outil CLI Himalaya en utilisant IMAP. Elle permet aux développeurs de rechercher, résumer et supprimer des emails d'un compte IMAP avec des requêtes en langage naturel. Utilisez-la pour automatiser des flux de travail liés aux emails, comme obtenir des résumés quotidiens ou effectuer des opérations par lots directement depuis Claude.

Voir la compétence

imsg

Communication

imsg est un outil CLI pour macOS qui vous permet d'interagir de manière programmatique avec iMessage/SMS via l'application Messages. Il permet aux développeurs de lister les conversations, d'afficher l'historique des messages, de surveiller les échanges en temps réel, et d'envoyer des messages ou des pièces jointes. Utilisez cette compétence pour automatiser les tâches de messagerie ou intégrer la fonctionnalité iMessage/SMS dans vos flux de travail de développement.

Voir la compétence

internationalization-i18n

Communication

Cette compétence Claude fournit des conseils complets pour la mise en œuvre de l'internationalisation (i18n) et de la localisation dans les applications. Elle couvre des tâches clés telles que l'extraction des messages, la gestion des traductions, le formatage spécifique aux paramètres régionaux et la prise en charge RTL à l'aide de bibliothèques comme i18next et gettext. Utilisez-la lors de la création d'applications multilingues ou de l'ajout de fonctionnalités de localisation pour les utilisateurs internationaux.

Voir la compétence

wacli

Communication

wacli est un outil en ligne de commande qui permet l'envoi de messages, la recherche et la synchronisation via le protocole WhatsApp Web. Il est principalement utilisé dans les workflows Clawdis pour une gestion automatisée, mais peut être appelé directement pour envoyer des messages, synchroniser des conversations ou interroger l'historique. Ses principales fonctionnalités incluent l'authentification par QR code, la synchronisation continue en arrière-plan et la capacité d'envoyer à la fois du texte et des fichiers.

Voir la compétence