Serde es una increíble biblioteca de serialización para Rust y ha sido una gran razón por la que me sentí productivo con ella durante años. Sin embargo, ya mientras trabajaba en Sentry me frustra bastante con algunos de los límites con los que se encuentra, pero reemplazar realmente Serde es complicado debido a la influencia que tiene en el ecosistema. También porque es bastante difícil de hacer mejor sin también hacer algunos compromisos potencialmente dolorosos.
Aquí hay tres ejemplos de casos límite de Serde que muestran malas interacciones de las características de Serde o limitaciones inesperadas: Un número que es un mapa. Una enumeración etiquetada internamente, con la función serde_json arbitrary_precision activada. El aplanamiento rompe las claves enteras.
Los adaptadores no se componen. Ninguno de estos son errores que se pueden arreglar fácilmente en Serde. Salen de su diseño, y ese diseño está protegido por las garantías de estabilidad de Serde.
En 2022 empecé un experimento llamado Deser. Es una biblioteca de serialización para Rust que toma la experiencia de usuario de Serde y la coloca encima de una arquitectura completamente diferente inspirada en miniserde. Nunca lo terminé realmente y se quedó allí durante unos años.
Lo recogí de nuevo y ahora ha llegado a un punto donde creo que vale la pena echarle un vistazo. Incluso solo para inspirar a otros a ver si quieren explorar el espacio. El nombre y la idea El nombre es Serde con sus dos mitades intercambiadas.
Deser es Serde pero de otra manera. En Serde, un tipo impulsa el proceso de deserialización: una implementación de Deserialize pide al desirializador el tipo de valor que espera, el formato llama de vuelta a un visitante. Cada valor anidado se maneja mediante recursión, lo que hace que la deserialización de Serde crezca la pila con cada nivel de anidación.
Deser, por el contrario, invierte esto y el formato le dice el tipo del siguiente valor y empuja eventos a un sink. Cuando un sink llega al comienzo de un valor anidado, no llama a él sino que devuelve un nuevo sink a un conductor, que mantiene todo el estado en el montón (de hecho, en un arena). En el camino de salida, los emisores devuelven sus valores anidados en lugar de recursión hacia ellos.