私は、受信フレームを逆シリアル化してserde_json::Value
に入れて、この値を(潜在的に多くの)コールバックに渡すwebsocketサーバーを作成しています。エンコード/デコードパスなしで、serde_json::Value
を新しいタイプ(たとえば、下記の例ではMyType
)に変換するコールバックをご希望です。 serde機械はこれを行うのに十分な情報を持っている必要があります(含まれているフィールドとタイプが一致しないとエラーが発生する可能性があります)。以下の例では、関数to_my_type()
はこのコールバック関数を表しています。私はこの機能からバイパスしたいエンコード/デコードです。serde_json :: Valueを具体的な型に変換する方法デシリアライズ特性を実装するには?
もちろん、生のコード化されたデータを各コールバックに渡すことはできますが、各コールバックは別々にデコードする必要があります。私はコールバックの関数シグネチャをタイプserde_json::Value
の引数をとっておき、異なるコールバックが異なるタイプを得ることができるようにしますが、すべてを共通の関数シグネチャで登録することができます。
#![feature(proc_macro)]
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
#[derive(Serialize, Deserialize)]
struct MyType {
a: bool,
}
fn as_json(a: &MyType) -> serde_json::Value {
let buf = serde_json::to_vec(a).unwrap();
serde_json::from_slice::<serde_json::Value>(&buf).unwrap()
}
fn to_my_type(value: serde_json::Value) -> MyType {
// How to convert a serde_json::Value into MyType without encode/decode pass?
let buf = serde_json::to_vec(&value).unwrap();
serde_json::from_slice::<MyType>(&buf).unwrap()
}
fn main() {
let store = MyType{a: true};
let raw_json = as_json(&store);
let _store2 = to_my_type(raw_json);
}
あなたの質問がより明確にすることができますか?私はそれが何らかの形で暗黙のうちに(「serdeでこれらの変換関数を登録する方法」のような)何かを暗黙的に考えていると思います。 – hansaplast
質問は私のポストのタイトルです "どのようにserer_json :: Valueを具体化して特性をデシリアライズする方法に変換するのですか?"サンプルコード "serde_json :: Valueをエンコード/デコードパスなしでMyTypeに変換する方法"で再度説明します。 –