HeadlinesBriefing favicon HeadlinesBriefing.com

Repenser la sérialisation Rust : Défis de Deser face aux limites de Serde

Hacker News •
×

Serde est une incroyable bibliothèque de sérialisation pour Rust et a été une grande raison pour laquelle je me suis senti productif avec elle pendant des années. Cependant, déjà travaillant chez Sentry, j'ai assez frustré par certaines des limites avec lesquelles il est confronté, mais remplacer réellement Serde est délicat en raison de l'importance qu'il a dans l'écosystème. De plus, il est assez difficile d'améliorer les choses sans également faire quelques compromis potentiellement douloureux.

Voici trois exemples de cas limites de Serde qui montrent de mauvaises interactions entre les fonctionnalités de Serde ou des limitations inattendues : Un nombre qui est une carte. Une énumération taguée internement, avec la fonctionnalité serde_json arbitrary_precision activée. Pliage qui casse les clés entières.

Les adaptateurs ne se composent pas. Aucun de ces problèmes n'est facile à corriger dans Serde. Ils découlent de son design, et ce design est protégé par les garanties de stabilité de Serde.

En 2022, j'ai lancé une expérience appelée Deser. C'est une bibliothèque de sérialisation pour Rust qui prend l'expérience utilisateur de Serde et la place au-dessus d'une architecture complètement différente, inspirée de miniserde. Je ne l'ai jamais vraiment terminée et elle est restée inactive pendant quelques années.

Je l'ai relancée et elle a maintenant atteint un point où je pense qu'elle vaut la peine d'être examinée. Même juste pour inspirer les autres à voir s'ils veulent explorer cet espace. Le nom et l'idée Le nom est Serde avec ses deux moitiés échangées.

Deser est Serde mais d'une autre manière. Dans Serde, un type pilote le processus de désérialisation : une implémentation de Deserialize demande au désérialiseur le type de valeur qu'il attend, le format rappelle une visiteuse. Chaque valeur imbriquée est gérée par récursion, ce qui rend la désérialisation Serde inhérentement dépendante de la pile à chaque niveau d'imbrication.

Deser, au contraire, retourne ce processus et le format indique le type de la prochaine valeur et pousse des événements vers un sink. Lorsqu'un sink atteint le début d'une valeur imbriquée, il ne fait pas appel à celle-ci mais renvoie un nouveau sink à un pilote, qui conserve tous les états sur le tas (en fait, dans une arène). En sortie, les émetteurs renvoient leurs valeurs imbriquées au lieu de les récursive vers l'intérieur.