Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 将Rust结构的泛型参数约束为反序列化_Generics_Rust_Serde - Fatal编程技术网

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};//生成编译器错误
}
另见:


您能否发布您想要工作的确切代码,并添加您收到的错误消息?我不确定你想取消哪一行的注释。好的。试图澄清对库代码的无效尝试。这很有帮助,谢谢!不幸的是,我仍然和你一样困惑……第一段代码证明你可以实例化X,而不需要反序列化Main。没有错误,除非您实际反序列化XWow。谢谢与serde合作,作者dtolnay也帮助理解了它为什么会这样工作。太棒了,谢谢!