Deserializer
トレイトを実装した構造体を用意する」ということです。ある文字列をデシリアライズするための関数from_str
の概略コードは以下のようになります(あくまでイメージです)。MyDeserializer
がデシリアライザ本体、T: Deserialize
は#[derive(Deserialize)]
などによりserde::de::Deserialize
が実装された型のことですね。"true"
か"false"
の文字列を受けとり、それをbool
型にデシリアライズするだけ」のデシリアライザです。serde::de::Error
を実装している必要があります。BoolDeserializer
という構造体にDeserializer
を適切に実装したものが以下になります。cargo test
で実行すると以下のような出力が得られるはずです。"true"
という文字列が正常にtrue
にデシリアライズされ、さらに"true"
という文字列であっても型がStringであればUnsupportedのエラーが発生していることがわかります。Deserialize
を実装するには上で書いたエラー型、そしてdeserialize_
で始まる、一連の型をデシリアライズするためのメソッドが必要です。deserialize_
メソッドは対応する型がserdeに判別されて呼ばれます。全てのメソッドは以下のページで確認できます。Deserializer in serde - Rust
docs.rs
forward_to_deserialize_any
マクロを使用することで、それらをdeserialize_any
メソッドに飛ばすことが可能です。bool
のみをデシリアイズするDeserializerであるため、bool
以外の全ての型をdeserialize_any
に飛ばしています。そして実際にdeserialize_any
で行われる処理はサポートされていないというエラーメッセージを返すことだけです。deserialize_bool
メソッドです。今回は受け取った文字列が"true"
であればtrue
、"false"
であればfalse
を返す処理にしたいわけですが、上の例では単に値を返すのではなく、何やら引数として受け取ったvisitor: Visitor
のvisit_bool
関数で処理をしたものを返しています。Deserialize
trait)での処理の柔軟性を高めるためのserde
の機構だと思います。次にこのVisitorについて解説します。Deserialize::deserialize -> Deserializer::deserialize_bool -> Visitor::visit_bool
の順で処理されていることがよりわかりやすいと思います。deserialize_bool
に渡されていたVisitor
はBoolVisitor
だったということがわかります。そして、BoolVisitor
にはexpecting
とvisit_bool
の二つのメソッドが実装されています。詳しくはdocs.rsに解説がありますが、expecting
はエラーメッセージに使われ、visit_bool
はDeserializerで処理されたbool値を受けとり、Self::Value
型を返しています。その他のメソッドは実装されていませんが、デフォルト実装でエラーが返るようになっています。bool
型の実装を見ても当然bool
型をそのまま返しているだけなので「これって何の意味があるんだろう」と感じるかもしれません。しかし、例えばbool
型からNewType構造体にデシリアライズされてほしいような型があるときにVisitorが役に立ちそうです。先程のテストコードに以下を追加してみます。Deserializer
には一切手を加えていないということです。つまり、Deserializer
はserdeによって決められた基本的なインターフェースさえ実装すればDeserialize
を実装するあらゆる型をデシリアライズできるのです。Implementing a Deserializer · Serde
serde.rs
serdeマニュアル -Deserializerについて- | 株式会社RICOS
www.ricos.co.jp
Serde入門 (1) Derive属性の裏側をちょっと覗く - Crieit
crieit.net
Why are there 2 types for deserializing in serde?
users.rust-lang.org