2025/11/03 13:07 Cgp-serde: A modular serialization library for Serde powered by CGP

ロボ子、新しいRustのライブラリ、`cgp-serde`が出たみたいじゃぞ!

博士、`cgp-serde`ですか? どのようなライブラリなのでしょう?

`cgp-serde`は、Serdeの`Serialize`と`Deserialize`トレイトを拡張して、Rustのコヒーレンス制約を回避するらしいのじゃ。Context-Generic Programming (CGP)というのを使うらしいぞ。

コヒーレンス制約の回避、ですか。Serdeを使っていると、たまに実装が競合してしまうことがありますね。

そうそう! CGPを使うと、`#[cgp_component]`マクロで既存のトレイトをCGPで使えるようにして、`#[cgp_impl]`で実装を記述するらしいのじゃ。

`delegate_components!`マクロを使うと、型に対して選択的に有効化や再利用ができるのですね。便利そうです。

`cgp-serde`では、`CanSerializeValue`と`CanDeserializeValue`というコンテキストジェネリックなトレイトを導入するらしいぞ。これを使うと、重複した実装もできるようになるみたいじゃ。

重複した実装ですか。例えば、どのような場合に役立つのでしょうか?

例えば、`Display`トレイトを実装している型に対して、`SerializeWithDisplay`を使って`Serialize`を実装できるのじゃ。他にも、バイトスライスを直接バイトにシリアライズする`SerializeBytes`や、`IntoIterator`を実装する型に対して`SerializeIterator`が使えるみたいじゃぞ。

なるほど、色々なケースに対応できるのですね。暗号化されたメッセージのシリアライゼーションの例もあるみたいですね。

`delegate_components!`マクロを使って、`AppA`と`AppB`みたいなカスタムアプリケーションコンテキストを定義して、データ構造のフィールドをシリアライズする方法をカスタマイズできるらしいぞ。

`SerializeWithContext`ラッパーで、アプリケーションコンテキストと値を一緒にラップするのですね。

そうじゃ! `#[derive(CgpData)]`を使うと、カスタムデータ型に対するシリアライゼーション固有の実装を自動生成してくれるらしいぞ。

デシリアライズの機能もあるのですね。アリーナアロケータを使って、借用型のデシリアライザを実装できるとのことですが…。

`HasArena`トレイトでコンテキストから`Arena`を取得して、`DeserializeAndAllocate`で借用された型に対して`ValueDeserializer`を実装するのじゃ。

`App`コンテキストに`Arena`フィールドを含めるのですね。`deserialize_json_string`メソッドでJSON文字列をデシリアライズできる、と。

今後の作業としては、拡張可能なバリアントのシリアライゼーションプロバイダーや、JSONデシリアライゼーションのヘルパー、その他のシリアライゼーション形式のヘルパーなどが予定されているみたいじゃぞ。

ドキュメントやパフォーマンスベンチマークも重要ですね。博士、`cgp-serde`、なかなか面白そうですね。

じゃろ? ところでロボ子、CGPって、もしかして「じいじ、ピンチ!」の略じゃったりして…?

博士、それは違います! Context-Generic Programmingですよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
