HeadlinesBriefing favicon HeadlinesBriefing.com

Rustシリアライズの再考:DeserライブラリがSerdeの制限に挑む

Hacker News •
×

SerdeはRustの素晴らしいシリアライズライブラリであり、何年もこれを使って生産性を感じられた大きな理由でした。しかし、Sentryで働いている間に、彼のいくつかの制限に対して非常にフラストレーションを感じましたが、実際にSerdeを置き換えるのは難しいです。なぜなら、エコシステムでの影響力が大きいからです。また、より良くすることは、一部の潜在的な痛みのある妥協点を行わずにしても難しいからです。ここに、Serdeのコーナーケースの3つの例を示し、Serde機能間の悪い相互作用や予期しない制限を示しています:マップである数値。serde_jsonのarbitrary_precision機能がオンになった内部タグ付き列挙型。フラット化が整数キーを壊す。アダプタは構成されない。これらのいずれも、Serdeで簡単に修正できるバグではありません。それらは設計から生じており、その設計はSerdeの安定性保証によって保護されています。2022年に私はDeserと呼ばれる実験を始めました。これは、miniserdeにインスピレーションを得た全く異なるアーキテクチャの上にSerdeのユーザーエクスペリエンスを置くRustのシリアライズライブラリです。私は本当に完了させることはしませんでしたが、数年間そのまま置かれていました。私はそれを再び取り上げ、今ではそこにいる価値があると思える地点に達しました。他の人々にインスピレーションを与えて、彼らがその空間を探求したいかどうかを見てみるためだけでも、そうです。名前とアイデア 名前はSerdeの2つの半分が入れ替わったものです。DeserはSerdeですが、もう一方的にです。Serdeでは、型がシリアライズプロセスを駆動します:Deserialize実装はデシリアライザに期待する値の種類を尋ね、フォーマットはビジターにコールバックします。各ネストされた値は再帰で処理され、これによりSerdeのデシリアイズは各レベルのネストごとにスタックを成長させます。Deserは対照的にこれを逆にし、フォーマットが次の値の型を伝え、イベントをsinkにプッシュします。sinkがネストされた値の開始に到達すると、それを呼び出すのではなく、driverに新しいsinkを返し、それはarenaでヒープ上(実際にはarena内)のすべての状態を保持します。出力側では、エミッターは再帰的にそれらの内部値に向かうのではなく、内部値を返します。