Técnicas avanzadas de serialización
Manejo de objetos de fecha y hora
Uso de un codificador JSON personalizado para datetime
import json
from datetime import datetime, date
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, (datetime, date)):
return obj.isoformat()
return super().default(obj)
## Example usage
current_time = {
"timestamp": datetime.now(),
"date": date.today()
}
json_string = json.dumps(current_time, cls=DateTimeEncoder)
print(json_string)
Optimización del rendimiento de la serialización
JSON compacto vs. legible
## Compact serialization
compact_json = json.dumps(data, separators=(',', ':'))
## Readable serialization with indentation
readable_json = json.dumps(data, indent=4)
Manejo de estructuras de datos grandes
Serialización JSON en streaming
def stream_large_data(large_data):
with open('large_data.json', 'w') as file:
json.dump(large_data, file,
cls=DateTimeEncoder,
stream=file)
Flujo de trabajo avanzado de manejo de errores
graph TD
A[Input Data] --> B{Validate Structure}
B -->|Valid| C[Prepare Serialization]
B -->|Invalid| D[Raise Validation Error]
C --> E{Choose Encoder}
E -->|Standard| F[Basic Serialization]
E -->|Custom| G[Advanced Encoding]
F --> H[Output JSON]
G --> H
Comparación de técnicas de serialización
Técnica |
Caso de uso |
Rendimiento |
Complejidad |
Serialización básica |
Objetos simples |
Alto |
Bajo |
Codificador personalizado |
Objetos complejos |
Medio |
Medio |
Streaming |
Grandes conjuntos de datos |
Bajo |
Alto |
Técnicas avanzadas de codificación
Serialización recursiva de objetos
def recursive_serializer(obj):
if hasattr(obj, '__dict__'):
return {
key: recursive_serializer(value)
for key, value in obj.__dict__.items()
}
elif isinstance(obj, (list, tuple)):
return [recursive_serializer(item) for item in obj]
return obj
class NestedObject:
def __init__(self, name, details):
self.name = name
self.details = details
## Example usage
nested_data = NestedObject("LabEx", {"version": 2.0})
serialized_data = json.dumps(nested_data, default=recursive_serializer)
Consideraciones de seguridad
Prevención de vulnerabilidades de serialización
- Limitar la profundidad de recursión
- Validar los datos de entrada
- Utilizar métodos de serialización seguros
- Implementar comprobación de tipos
Técnicas avanzadas clave
- Codificadores JSON personalizados
- Manejo de
datetime
- Optimización del rendimiento
- Serialización recursiva
- Streaming de grandes conjuntos de datos
Al dominar estas técnicas avanzadas, puedes manejar escenarios de serialización complejos con confianza y eficiencia en Python.