我希望限制一个(反)序列化的结构体只能有一个通用参数,并且该参数也必须可反序列化。自动生成的宏
Deserialize
不需要我添加此约束,这很好,但我希望即使他们从未尝试对库中定义的结构体进行反序列化,集成代码也会出现编译错误。use failure::Fallible; // 0.1.6
use serde::{Deserialize, Serialize}; // 1.0.104
use serde_json::to_string_pretty; // 1.0.44
#[derive(Deserialize, Serialize)]
struct X<T>
where
// T: Serialize,
{
a: u8,
t: T,
}
type Main<'a> = &'a dyn Fn() -> Fallible<()>;
fn main() -> Fallible<()> {
let x = X { a: 1, t: false };
println!("{}", to_string_pretty(&x)?);
let y: X<bool> = serde_json::from_str(r#"{"a":2,"t":true}"#)?;
println!("{}", y.t);
let _z: X<Main> = X { a: 3, t: &main };
// println!("{}", to_string_pretty(&z)?);
//let w: X<Main> = serde_json::from_str(r#"{"a":4,"t":NONONO}"#)?;
Ok(())
}
- 如果我取消注释带有
to_string_pretty(&z)
的行,编译将会失败,这是很好的。 - 即使没有那一行,如果我取消注释
where T: Serialize
,编译也会在let _z = ...
的一行失败。这是很好的,因为它帮助库集成者在开始序列化之前就发现他们正在使用一个非可序列化类型参数的struct X
。
我试图添加where for<'a> T: serde::de::Deserialize<'a>
作为对struct X<T>
的限制条件,但这会导致构建失败,即使没有任何东西使用X
。
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct X<T>
where
for<'a> T: serde::de::Deserialize<'a>,
{
a: u8,
t: T,
}
有没有一种方式来表达我所寻求的约束条件?