design-serialization-schema
关于
This skill helps developers design serialization schemas using JSON Schema, Protocol Buffers, or Apache Avro. It covers schema versioning, backward compatibility, validation rules, and evolution strategies for long-lived data formats. Use it when defining new API contracts, extending existing schemas without breaking consumers, or migrating between schema versions.
快速安装
Claude Code
推荐npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/design-serialization-schema在 Claude Code 中复制并粘贴此命令以安装该技能
技能文档
name: design-serialization-schema description: > Disenar esquemas de serializacion usando JSON Schema, definiciones de Protocol Buffer o Apache Avro. Cubre versionado de esquemas, compatibilidad hacia atras, reglas de validacion y estrategias de evolucion para formatos de datos de larga duracion. Usar al definir un nuevo contrato de API o formato de intercambio de datos, agregar campos a un esquema existente sin romper consumidores, migrar entre versiones de esquema, elegir entre sistemas de esquema, o documentar reglas de validacion de datos para aplicacion automatizada. 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-schema, protobuf, avro, schema-evolution, versioning, compatibility locale: es source_locale: en source_commit: 6f65f316 translator: claude-sonnet-4-6 translation_date: 2026-03-16
Disenar Esquema de Serializacion
Crear esquemas de serializacion bien versionados que evolucionan elegantemente sin romper consumidores.
Cuando Usar
- Definir un nuevo contrato de API o formato de intercambio de datos
- Agregar campos a un esquema existente sin romper consumidores
- Migrar entre versiones de esquema
- Elegir entre sistemas de esquema (JSON Schema, Protobuf, Avro)
- Documentar reglas de validacion de datos para aplicacion automatizada
Entradas
- Requerido: Modelo de datos (relaciones entre entidades, tipos de campos, restricciones)
- Requerido: Requisitos de compatibilidad (quien consume estos datos, cuanto tiempo deben ser legibles los formatos antiguos)
- Opcional: Esquema existente a evolucionar
- Opcional: Requisitos de rendimiento (velocidad de validacion, integracion con registro de esquemas)
- Opcional: Formato de serializacion objetivo (JSON, binario, columnar)
Procedimiento
Paso 1: Elegir un Sistema de Esquema
| Sistema | Formato | Fortalezas | Mejor para |
|---|---|---|---|
| JSON Schema | JSON | Ampliamente soportado, validacion flexible | APIs REST, validacion de config |
| Protocol Buffers | Binario | Compacto, rapido, tipado fuerte, evolucion integrada | gRPC, microservicios |
| Apache Avro | Binario/JSON | Esquema en datos, excelente soporte de evolucion | Kafka, pipelines de datos |
| XML Schema (XSD) | XML | Tipado completo, soporte de namespaces | Empresarial/legado SOAP |
| TypeBox/Zod | TypeScript | Inferencia de tipos, validacion en runtime | APIs TypeScript |
Esperado: Sistema de esquema seleccionado basado en ecosistema, necesidades de rendimiento y requisitos de evolucion. En caso de fallo: Si hay incertidumbre, comenzar con JSON Schema -- tiene el soporte de herramientas mas amplio y puede agregarse sobre APIs JSON existentes.
Paso 2: Disenar el Esquema Central
Ejemplo de JSON Schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/schemas/measurement/v1",
"title": "Measurement",
"description": "A sensor measurement reading",
"type": "object",
"required": ["sensor_id", "value", "unit", "timestamp"],
"properties": {
"sensor_id": {
"type": "string",
"pattern": "^[a-z]+-[0-9]+$",
"description": "Unique sensor identifier (lowercase-digits format)"
},
"value": {
"type": "number",
"description": "Measured value"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit", "kelvin", "percent", "ppm"],
"description": "Unit of measurement"
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 timestamp with timezone"
},
"metadata": {
"type": "object",
"additionalProperties": true,
"description": "Optional key-value metadata"
}
},
"additionalProperties": false
}
Ejemplo de Protocol Buffers:
syntax = "proto3";
package sensors.v1;
import "google/protobuf/timestamp.proto";
message Measurement {
string sensor_id = 1;
double value = 2;
Unit unit = 3;
google.protobuf.Timestamp timestamp = 4;
map<string, string> metadata = 5;
}
enum Unit {
UNIT_UNSPECIFIED = 0;
UNIT_CELSIUS = 1;
UNIT_FAHRENHEIT = 2;
UNIT_KELVIN = 3;
UNIT_PERCENT = 4;
UNIT_PPM = 5;
}
Esperado: Esquema auto-documentado con descripciones, restricciones y definiciones claras de tipos.
En caso de fallo: Si el modelo de datos aun no es estable, marcar el esquema como draft y evitar publicarlo en un registro.
Paso 3: Planificar la Evolucion del Esquema
Reglas de compatibilidad:
| Cambio | Compatible hacia atras? | Compatible hacia adelante? | Seguro? |
|---|---|---|---|
| Agregar campo opcional | Si | Si | Si |
| Agregar campo requerido | No | Si | No (rompe consumidores existentes) |
| Eliminar campo opcional | Si | No | Con cuidado (productores aun pueden enviar) |
| Eliminar campo requerido | Si | No | Con cuidado |
| Renombrar campo | No | No | No (usar alias + deprecacion) |
| Cambiar tipo de campo | No | No | No (agregar nuevo campo, deprecar antiguo) |
| Agregar valor enum | Si (si consumidores ignoran desconocidos) | No | Depende de la implementacion |
| Eliminar valor enum | No | Si | No |
Estrategia de evolucion segura:
- Solo agregar campos opcionales con valores predeterminados razonables
- Nunca eliminar ni renombrar -- deprecar en su lugar
- Versionar el esquema en el identificador (
v1,v2) - Usar un registro de esquemas para formatos binarios (Confluent Schema Registry para Avro/Protobuf)
Esperado: Plan de evolucion documentado: que cambios son seguros, cuales requieren nuevas versiones. En caso de fallo: Si un cambio incompatible es inevitable, versionar el esquema (v1 -> v2) y mantener soporte paralelo durante la migracion.
Paso 4: Implementar Validacion de Esquema
# JSON Schema validation (Python)
from jsonschema import validate, ValidationError
import json
schema = json.load(open("measurement_v1.json"))
def validate_measurement(data: dict) -> list[str]:
"""Validate a measurement against the schema. Returns list of errors."""
errors = []
try:
validate(instance=data, schema=schema)
except ValidationError as e:
errors.append(f"{e.json_path}: {e.message}")
return errors
# Usage
errors = validate_measurement({"sensor_id": "s-01", "value": "not_a_number"})
# -> ["$.value: 'not_a_number' is not of type 'number'"]
Esperado: La validacion se ejecuta en todos los datos entrantes en los limites del sistema (endpoints API, ingestion de archivos). En caso de fallo: Registrar errores de validacion con la carga completa (redactando campos sensibles) para depuracion.
Paso 5: Documentar el Esquema
Crear una pagina de documentacion del esquema con: resumen, tabla de campos (campo, tipo, requerido, descripcion, restricciones), registro de cambios (version, fecha, cambios) y politica de compatibilidad.
Esperado: La documentacion se genera automaticamente o se mantiene sincronizada con la definicion del esquema. En caso de fallo: Si la documentacion se desvia del esquema, agregar una verificacion CI que valide la documentacion contra la fuente del esquema.
Validacion
- El esquema usa el sistema apropiado para el caso de uso (JSON Schema, Protobuf, Avro)
- Todos los campos tienen tipos, descripciones y restricciones
- Campos requeridos vs opcionales estan definidos explicitamente
- Estrategia de evolucion documentada (cambios seguros, politica de versionado)
- Validacion implementada en los limites del sistema
- El esquema esta versionado con un registro de cambios
- Prueba de ida y vuelta: serializar -> deserializar -> comparar confirma sin perdida de datos
Errores Comunes
- Restringir demasiado temprano: Validacion estricta en un esquema nuevo bloquea la iteracion. Comenzar permisivo (
additionalProperties: true), restringir despues. - Sin valores predeterminados: Agregar un campo requerido sin predeterminado rompe todos los datos existentes. Siempre proporcionar predeterminados para nuevos campos.
- Ignorar null: Muchos esquemas no manejan campos null/faltantes claramente. Ser explicito sobre nullable vs opcional.
- Version en la carga, no en la URL: Para datos de larga duracion (almacenamiento, eventos), incrustar la version del esquema en los datos mismos, no solo en la URL del endpoint.
- Exhaustividad de enum: Agregar un nuevo valor enum puede causar crashes en consumidores que usan sentencias switch exhaustivas. Documentar que los valores desconocidos deben manejarse elegantemente.
Habilidades Relacionadas
serialize-data-formats-- seleccion de formato e implementacion de codificacion/decodificacionimplement-pharma-serialisation-- serializacion farmaceutica (esquemas regulados)write-validation-documentation-- documentacion de validacion para esquemas regulados
GitHub 仓库
相关推荐技能
executing-plans
设计该Skill用于当开发者提供完整实施计划时,以受控批次方式执行代码实现。它会先审阅计划并提出疑问,然后分批次执行任务(默认每批3个任务),并在批次间暂停等待审查。关键特性包括分批次执行、内置检查点和架构师审查机制,确保复杂系统实现的可控性。
requesting-code-review
设计该Skill可在完成任务、实现主要功能或合并代码前自动调度代码审查子代理,确保实现符合需求和计划。它支持通过指定git SHA范围进行精准的代码变更审查,帮助开发者在关键节点及时发现潜在问题。核心原则是"早审查、勤审查",适用于开发流程的各个关键阶段。
connect-mcp-server
设计这个Skill指导开发者如何将MCP服务器连接到Claude Code,支持HTTP、stdio和SSE三种传输协议。它涵盖了从安装配置到认证安全的完整流程,适用于集成GitHub、Notion、数据库等外部服务。当开发者需要添加集成、配置外部工具或提及MCP相关功能时,这个Skill能提供实用的操作指南。
web-cli-teleport
设计该Skill帮助开发者根据任务特性选择Claude Code的Web或CLI界面,并指导如何在两种环境间无缝迁移会话。它能分析任务复杂度、迭代需求等要素,推荐最优工作界面和工作流。关键特性包括会话状态管理、环境切换指导和上下文优化建议。
