为什么这个程序无法编译?以及如何解决这个问题? 我正在尝试使用 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.
}
由于
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),
}