serdeのSerialize/Deserializeトレイトは標準入りできる存在か
#rust
ふと思ったので考えてみた。
Serialize Deserialize は一見すると特定のシリアライザに依存しない
code:serialize.rs
pub trait Serialize {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>;
}
Hash も似たような形で、こちらは標準にある
code:hash.rs
pub trait Hash {
fn hash<H: Hasher>(&self, state: &mut H);
fn hash_slice<H: Hasher>(data: &Self, state: &mut H) { ... }
}
Hasher は Serializer よりもずっと単純
std::hash::Hasher - Rust
HashMap のように非常に基本的な型に必要となる
シリアライズ処理はいくつかの項目についてのトレードオフがある
サイズ
互換性
セーフティ、エラー復旧
Rustは、その目的からも、ゼロコストの抽象化 ... コンパイル時の Serializer の選択までこれらトレードオフの選択の多くを遅延できるAPIデザインが求められるだろう
いずれにしてもこのSerialize/Deserializeを行う実装 (ここではserdeを用いた実装) の外においても利用できるようWell-definedであることは求められるだろう
Serde data model
これはつまりこのデータモデルへの依存を必要とする
それ以前にプログラミング言語上の表現への依存を必要とするが
標準ライブラリはどこまで含むべきか論
See also: Proposal: New channels for Rust's standard library
他の言語
C#の SerializableAttribute は標準の System 名前空間にある
Serialization (C#) | Microsoft Docs
標準で XmlSerializer BinaryFormatter 等のシリアライザが提供されている
[Serializable] なデータ型からのシリアライズをどう実装しているかは未把握、おそらくReflection
protobuf