为了熟悉Rust,我自己编写了一个以BitVec为后盾的Bloom滤镜.其中的一部分将包括save方法,该方法使用serde序列化整个 struct 并将其写入文件.不幸的是,我在派生Serialize特征时遇到编译器错误:

use bitvec::vec::BitVec;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
pub struct BloomFilter {
    n: u64,  // items added
    m: u32,  // slice size
    k: u32,  // number of slices
    buf: BitVec,  // buffer
    state: [u8; 8],  // random state
}
error[E0277]: the trait bound `BitVec: Serialize` is not satisfied
    --> src/bloom.rs:12:10
     |
12   | #[derive(Serialize, Deserialize)]
     |          ^^^^^^^^^ the trait `Serialize` is not implemented for `BitVec`
...
17   |     buf: BitVec,  // buffer
     |     --- required by a bound introduced by this call

我相关的Cargo.toml个依赖项:

[dependencies]
bitvec = "1.0.1"
serde = { version = "1.0.196", features = ["derive"] }

这对我来说似乎很奇怪,因为docs for bitvec 1.0.1提到了Serialize(和Deserialize)作为实现的特征之一.我是不是犯了什么明显的错误?

推荐答案

crate 的一种常见做法是将SerializeDeserialize放在Cargo feature后面.Bitvec的功能列出了here,您可以使用以下命令启用serde功能:

cargo add bitvec -F serde

或者,您可以手动编辑Cargo.toml:

[dependencies]
bitvec = { version = "1.0.1", features = ["serde"] }

目前,除非是the crate manually indicates it,否则文档不会让您知道某个功能背后有什么,但希望在future ,这将被自动记录下来.

Rust相关问答推荐

trait 中self 的显式生命周期似乎导致E0499无法在循环中多次borrow * emits 器作为可变的

如何优化小型固定大小数组中的搜索?

如何对字符串引用的引用向量进行排序,而不是对最外层的引用进行排序?

在没有引用计数或互斥锁的情况下,可以从Rust回调函数内的封闭作用域访问变量吗?

闭包不会发送,即使它只捕获发送变量

为昂贵的for循环制作筛子

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

如何对一个特征的两个实现进行单元测试?

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

使用 pyo3 将 Rust 转换为 Python 自定义类型

Rust LinkedList 中的borrow 判断器错误的原因是什么?

更新 rust ndarray 中矩阵的一行

相当于 Rust 中 C++ 的 std::istringstream

Rust与_有何区别?

有什么方法可以通过使用生命周期来减轻嵌套生成器中的当生成器产生时borrow 可能仍在使用错误?

为什么具有 Vec 变体的枚举没有内存开销?

没有分号的返回表达式的性能是否比使用返回更好?在Rust ?

如何断言代码不会在测试中编译?

基于名称是否存在的条件编译