需要类型注释:无法满足 `T: Deserialize<'_>`

问题描述 投票:0回答:1

为什么这个程序无法编译?以及如何解决这个问题? 我正在尝试使用 serde 序列化通用枚举,其中通用类型是可序列化的。

use serde::{Deserialize, Serialize};

pub trait Row: for<'de> Deserialize<'de> + Serialize + Clone + Send + PartialEq {
    fn key(&self) -> Option<u64> {
        None
    }
    fn timestamp(&self) -> Option<u64> {
        None
    }
}



#[derive(Debug, PartialEq, Eq, Clone, Hash, Deserialize, Serialize)]
pub enum MessageContent<R: Row> {
    // Other serializable members
    Data(R),
}


fn main() {
    // Create object of MessageContent and serialize.
}
rust types serde
1个回答
0
投票

由于

Deserialize
派生宏扩展导致冗余特征绑定,因此程序无法编译。

考虑更简单的程序:

use serde::Deserialize;
pub trait Row: for<'de> Deserialize<'de> {}
#[derive(Deserialize)]
pub struct MessageContent<R: Row>(R);

如果我们

cargo expand
宏,我们将看到
R
有一个
Row
边界和
serde::Deserialize<'de>
边界(在
where
子句中):

#[automatically_derived]
impl<'de, R: Row> _serde::Deserialize<'de> for MessageContent<R> where
    R: _serde::Deserialize<'de> {
        ...
}

如果我们尝试编译它,则会出现错误提示不允许冗余:

error[E0283]: type annotations needed: cannot satisfy `R: Deserialize<'_>`
note: multiple `impl`s or `where` clauses satisfying `R: Deserialize<'_>` found

要解决这个问题,我们必须删除其中一个冗余边界。为了保持

Row
特征相同,我们应该删除
Deserialize
宏的额外界限。我们使用
#[serde(bound(...))]
属性告诉宏
Raw
是使
R
可反序列化的界限。请注意,
for<'de> Deserialize<'de>
最好写成
serde::de::DeserializeOwned

use serde::{de::DeserializeOwned, Deserialize, Serialize};

pub trait Row: DeserializeOwned + Serialize + Clone + Send + PartialEq {
    fn key(&self) -> Option<u64> {
        None
    }
    fn timestamp(&self) -> Option<u64> {
        None
    }
}

#[derive(Debug, PartialEq, Eq, Clone, Hash, Deserialize, Serialize)]
pub enum MessageContent<R: Row> {
    #[serde(bound(deserialize = "R: Row"))]
    Data(R),
}
© www.soinside.com 2019 - 2024. All rights reserved.