Generics 将Rust结构的泛型参数约束为反序列化
我想将(反)序列化结构限制为具有同样可反序列化的泛型参数。派生宏反序列化不需要我添加此约束,这很好,但我希望集成代码得到编译错误,即使它们从未尝试反序列化库中定义的结构Generics 将Rust结构的泛型参数约束为反序列化,generics,rust,serde,Generics,Rust,Serde,我想将(反)序列化结构限制为具有同样可反序列化的泛型参数。派生宏反序列化不需要我添加此约束,这很好,但我希望集成代码得到编译错误,即使它们从未尝试反序列化库中定义的结构 use failure::Fallible;//0.1.6 使用serde::{反序列化,序列化};//1.0.104 使用serde_json::to_string_pretty;//1.0.44 #[派生(反序列化、序列化)] 结构X 哪里 //T:连载, { 答:u8, t:t, } 类型主要易出错; fn main()-
use failure::Fallible;//0.1.6
使用serde::{反序列化,序列化};//1.0.104
使用serde_json::to_string_pretty;//1.0.44
#[派生(反序列化、序列化)]
结构X
哪里
//T:连载,
{
答:u8,
t:t,
}
类型主要易出错;
fn main()->易出错{
设x=x{a:1,t:false};
println!(“{}”,to_string_pretty(&x);
设y:X=serde_json::from_str(r#“{”a:2,t:true}”#)?;
println!(“{}”,y.t);
设z:X=X{a:3,t:&main};
//println!(“{}”,to_string_pretty(&z);
//设w:X=serde_json::from_str(r#“{”a:4,“t”:NONONO}“#”)?;
好(())
}
- 如果我用
,编译将失败,这很好将该行取消注释为\u string\u pretty(&z)
- 即使没有这一行,如果我取消注释
,编译也会在where T:Serialize
行失败。这很好,因为它可以帮助库集成商在实际开始序列化类型参数之前就发现他们正在使用带有不可序列化类型参数的let z=…
struct X
where for
作为对struct X
的约束,但即使不使用X
使用serde::{反序列化,序列化};
#[派生(反序列化、序列化)]
结构X
哪里
对于
{
答:u8,
t:t,
}
有没有一种方法可以表达我正在寻找的约束?您需要使用它来防止Serde尝试自动确定反序列化
和序列化
实现的边界:
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
#[serde(bound = "T: Serialize, for<'de2> T: Deserialize<'de2>")]
struct X<T>
where
T: Serialize,
for<'de2> T: Deserialize<'de2>,
{
t: T,
}
struct NotSerializable;
fn main() {
X { t: true };
// X { t: NotSerializable }; // Generates compiler error
}
使用serde::{反序列化,序列化};
#[派生(反序列化、序列化)]
#[serde(bound=“T:Serialize,for”)]
结构X
哪里
T:连载,
对于
{
t:t,
}
结构不可序列化;
fn main(){
X{t:true};
//X{t:NotSerializable};//生成编译器错误
}
另见: