簡體   English   中英

如何在我的“反序列化”實現中使用“serde_stacker”?

[英]How do I use `serde_stacker` in my `deserialize` implementation?

我有一個結構,如果我使用serde_stacker ,我只能反序列化。 因此,為了反序列化 struct Bar我需要先將其轉換為用於保存 JSON 值的serde_json::value::Value類型,然后將其轉換為所需的Bar類型。

const SIZE: usize = 30000;

#[derive(Clone, Debug, Serialize, Deserialize)]
struct Foo {
    #[serde(with = "BigArray")]
    vals: [bool; SIZE],
}

#[derive(Clone, Debug, Serialize, Deserialize)]
struct Bar {
    field0: Foo,
}

impl Bar {
    fn custom_deserialization_test(instance: Bar) {
        let json = serde_json::to_string(&instance).unwrap();
        let mut deserializer: serde_json::Deserializer<serde_json::de::StrRead> =
            serde_json::Deserializer::from_str(&json);
        let deserializer: serde_stacker::Deserializer<
            &mut serde_json::Deserializer<serde_json::de::StrRead>,
        > = serde_stacker::Deserializer::new(&mut deserializer);
        let value: Value = Value::deserialize(deserializer).unwrap();
        let target: Bar = from_value(value).unwrap();
    }
}

我的問題是:如何覆蓋Bardeserialize化方法以使用serde_stacker反序列化器而不是像上面那樣使用常規的serde_json反序列化器?

我可能需要某種包裝器,但最后一行代碼的from_value函數調用使用Bar的派生deserialize化方法從 JSON 對象轉換為Bar類型。

Bar::deserialize函數對所使用的Deserializer是通用的。 這意味着您可以使用serde_stacker::Deserializer而不是來自serde_jsonDeserializer 您發布的代碼片段已經展示了如何在Value類型上使用serde_stacker 您只需將其替換為Bar

impl Bar {
    fn custom_deserialization_test(instance: Bar) {
        let json = serde_json::to_string(&instance).unwrap();
        let mut deserializer: serde_json::Deserializer<serde_json::de::StrRead> =
            serde_json::Deserializer::from_str(&json);
        let deserializer: serde_stacker::Deserializer<
            &mut serde_json::Deserializer<serde_json::de::StrRead>,
        > = serde_stacker::Deserializer::new(&mut deserializer);
        let target = Bar::deserialize(deserializer).unwrap();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM