如何声明包含任何类型的 Deserializable/Serializable 结构的结构?
How do I declare a struct that contains any kind of Deserializable/Serializable struct?
我正在尝试声明一个结构,其中包含任何给定类型的另一个结构,可以是 Deserialize
和 Serialize
。
#[derive(Debug, Serialize, Deserialize)]
pub struct Foo<T: Deserialize + Serialize> {
pub data: T,
}
为此,我尝试使用特征边界,使用 DeserializeOwned
或 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 issue,我找到了解决方案。诀窍是不使用特征边界,而是使用属性边界。
#[derive(Debug, Serialize, Deserialize)]
pub struct Foo<T> {
#[serde(bound(
serialize = "T: Serialize",
deserialize = "T: Deserialize<'de>",
))]
pub data: T,
}
只是不要在类型上设置界限:
use serde::{Deserialize, Serialize}; // 1.0.91
#[derive(Debug, Serialize, Deserialize)]
pub struct Foo<T> {
pub data: T,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Boo {
pub a: i64,
}
fn main() {
let data = Boo { a: 1 };
let wrap = Foo { data };
println!("{:?}", wrap);
}
然后,在需要该行为的方法上设置界限:
fn use_it<T>(foo: Foo<T>)
where
Foo<T>: Serialize,
{
// ...
}
我正在尝试声明一个结构,其中包含任何给定类型的另一个结构,可以是 Deserialize
和 Serialize
。
#[derive(Debug, Serialize, Deserialize)]
pub struct Foo<T: Deserialize + Serialize> {
pub data: T,
}
为此,我尝试使用特征边界,使用 DeserializeOwned
或 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 issue,我找到了解决方案。诀窍是不使用特征边界,而是使用属性边界。
#[derive(Debug, Serialize, Deserialize)]
pub struct Foo<T> {
#[serde(bound(
serialize = "T: Serialize",
deserialize = "T: Deserialize<'de>",
))]
pub data: T,
}
只是不要在类型上设置界限:
use serde::{Deserialize, Serialize}; // 1.0.91
#[derive(Debug, Serialize, Deserialize)]
pub struct Foo<T> {
pub data: T,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Boo {
pub a: i64,
}
fn main() {
let data = Boo { a: 1 };
let wrap = Foo { data };
println!("{:?}", wrap);
}
然后,在需要该行为的方法上设置界限:
fn use_it<T>(foo: Foo<T>)
where
Foo<T>: Serialize,
{
// ...
}