【问题标题】:Borrow checker problems with serde-reflection使用 serde-reflection 借用检查器问题
【发布时间】:2021-01-03 22:47:38
【问题描述】:

我正在尝试使用serde-reflection 创建一个解释结构结构的 JSON 结构,以便以 JavaScript 和 ArrayBuffer 的形式传输和接收结构,然后将其反序列化为浏览器中的 JavaScript 对象。

我想要一种方法来“注册”我感兴趣的结构,然后跟踪所有注册的类型,以便可以从 Web 服务器返回它们。

extern crate serde_json;
use serde_json::json;

use serde_reflection::{Samples, Tracer, TracerConfig};

pub struct MessageRegistry {
    tracer: Tracer,
    samples: Samples
}

impl MessageRegistry {
    pub fn new() -> MessageRegistry {
        MessageRegistry {
            tracer: Tracer::new(TracerConfig::default()),
            samples: Samples::new()
        }
    }

    pub fn add_type<T>(&mut self) {
        self.tracer.trace_type::<T>(&self.samples).unwrap();
                  //^^^^^^^^^^ the trait `serde::Deserialize<'_>` is not implemented for `T`
    }

    pub fn to_json_string(&mut self) -> String {
        let registry = self.tracer.registry().unwrap();
        serde_json::to_string(&registry).unwrap()
    }
}

我坚持使用tracer.trace_type::&lt;T&gt;(&amp;self.samples) 行。如果我尝试使用 pub fn add&lt;'de, T: serde::Deserialize&lt;'de&gt;&gt;(&amp;mut self) { 来代替,我会遇到生命周期问题:

cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
expected `serde::Deserialize<'_>`
   found `serde::Deserialize<'de>`

【问题讨论】:

    标签: templates types rust traits serde


    【解决方案1】:

    编译错误告诉你如何修复错误,只需添加一个绑定到泛型参数TDeserialize。由于借用来自&amp;self.samples,那么Deserialize 也必须以某种方式绑定到self,我们可以使用通用参数'a 指定:

    use serde::de::Deserialize;
    use serde_reflection::{Registry, Samples, Tracer, TracerConfig};
    
    pub struct MessageRegistry {
        tracer: Option<Tracer>,
        samples: Samples,
        registry: Option<Registry>,
    }
    
    impl MessageRegistry {
        pub fn new() -> MessageRegistry {
            MessageRegistry {
                tracer: Some(Tracer::new(TracerConfig::default())),
                samples: Samples::new(),
                registry: None,
            }
        }
    
        pub fn add_type<'a, T: Deserialize<'a>>(&'a mut self) {
            self.tracer.as_mut().unwrap().trace_type::<T>(&self.samples).unwrap();
        }
    
        pub fn to_json_string(&mut self) -> String {
            self.registry = self.tracer.take().unwrap().registry().ok();
            serde_json::to_string(self.registry.as_ref().unwrap()).unwrap()
        }
    }
    

    注意:tracer.registry() 消耗了tracer,所以我必须将它包装在Option 中。还添加了一个包裹在对象中的Registry 字段,表示使用tracer 的结果。

    【讨论】:

    • 非常感谢! &amp;'a mut self 是我所需要的,现在它可以按预期工作了! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多