rust - 如何声明包含任何类型的可反序列化/可序列化结构的结构?
问题描述
我正在尝试声明一个结构,该结构包含任何给定类型的另一个结构,可以是Deserialize
and Serialize
。
#[derive(Debug, Serialize, Deserialize)]
pub struct Foo<T: Deserialize + Serialize> {
pub data: T,
}
锈操场。
为此,我尝试使用 trait bound,使用诸如DeserializeOwned
or之类的特征Deserialize
。两者都在编译时失败,并出现以下错误:
error[E0283]: type annotations required: cannot resolve `T: serde::Deserialize<'de>`
--> src/main.rs:9:28
|
9 | #[derive(Debug, Serialize, Deserialize)]
| ^^^^^^^^^^^
|
= note: required by `serde::Deserialize`
error[E0637]: `&` without an explicit lifetime name cannot be used here
--> src/main.rs:10:19
|
10 | pub struct Foo<T: Deserialize + Serialize> {
| ^^^^^^^^^^^ explicit lifetime name needed here
我在尝试增加生命周期时遇到了错误,因为我没有使用存储引用而是存储值。
声明这种结构的最惯用的方式是什么?
解决方案
多亏了 Rust Discord 的成员,我找到了一个解决方案,他向我推荐了以下 Github问题。诀窍不是使用特征边界,而是使用属性边界。
#[derive(Debug, Serialize, Deserialize)]
pub struct Foo<T> {
#[serde(bound(
serialize = "T: Serialize",
deserialize = "T: Deserialize<'de>",
))]
pub data: T,
}
推荐阅读
- mysql - 分组和求和 MySQL
- spring - 从 MongoDB spring Data 返回嵌套字段
- c++ - std::condition_variable::wait() 误解
- angular - 在 Cypress 中无法使 XHR 请求出错,net::ERR_BLOCKED_BY_CLIENT
- python - Python - 调用 psutil.process_iter 的模拟方法中的错误
- c# - 使用 Unity 拦截 c# 的可定制行为
- css - 材质 ui 手风琴边框底部未显示上手风琴兄弟姐妹
- php - 如何在 CodeIgniter 中创建音频验证码?
- flutter - 我在使用颤振平台方法通道的 kotlin 画中画上遇到问题
- terraform - 两个模块之间的模块组合使用条件 for_each 双向