我试图将一个由嵌套 struct 组成的对象序列化为CSV.嵌套的原因是纯粹的代码组织,我不希望序列化之后它仍然存在.这个代码示例代表了我所拥有的(playground)

use serde::Serialize;
use std::io;

#[derive(Serialize)]
struct UserInfo {
    id: String,
    username: String,
}

#[derive(Serialize)]
struct User {
    user_info: UserInfo,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut wtr = csv::Writer::from_writer(io::stdout());
    wtr.serialize(User {
        user_info: UserInfo {
            id: "1".to_string(),
            username: "Jon".to_string(),
        },
    })?;
    wtr.flush()?;
    Ok(())
}

运行这个会给我这个错误

错误(Serialize("无法在 struct 中写入头时序列化 struct 中的UserInfo容器"))

我试着把#[serde(flatten)]加到user_info,但这个issue也不支持.

有什么解决办法?如果有帮助的话,我不介意手动添加标题.我只想继续筑巢.

推荐答案

在您链接的问题下的 comments 线程中有一个解决方法:

use serde::Serialize;
fn main() {
  let mut w = csv::Writer::from_writer(std::io::stdout());
  w.serialize(Data::<CustomColumns>::default()).unwrap();
}

#[derive(Debug, Serialize, Default)]
struct Data<Extra: Serialize + Default>(DataInner, Extra);

#[derive(Debug, Serialize, Default)]
struct DataInner {
  a: usize,
  b: String,
}

#[derive(Debug, Serialize, Default)]
struct CustomColumns {
  custom: String,
}

也就是说,让最上面的 struct 体成为元组 struct 体,并将所有以前嵌套的 struct 体放入其中,从而将不支持的嵌套并排移除,例如:

#[derive(Serialize)]
struct UserInfo {
    id: String,
    username: String,
}

#[derive(Serialize)]
struct UserRow(User, UserInfo);

#[derive(Serialize)]
struct User {
    other_user_field: &'static str,
}

Rust相关问答推荐

如何在Rust中实现Functor trait?

创建包含缺失值的框架

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

如何使用 list 在Rust for Windows中编译?

自定义结果枚举如何支持`?`/`FromResidual`?

在0..1之间将U64转换为F64

程序在频道RX上挂起

使用关联类型重写时特征的实现冲突

为什么 vec![Vec::with_capacity(n)] 为子向量创建 0 容量?

Cargo.toml:如何有条件地启用依赖项功能?

为什么某些类型参数仅在特征边界中使用的代码在没有 PhantomData 的情况下进行编译?

为什么 Rust 字符串没有短字符串优化 (SSO)?

Rust并发读写引起的死锁问题

Rust: 目标成员属于哪个"目标家族"的列表是否存在?

从Rust 的临时文件中创建引用是什么意思?

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

如何在 Rust 中将 bson::Bson 转换为 Vec

为什么可以在迭代器引用上调用 into_iter?

在 RefCell 上borrow

如何在没有 `make_contiguous()` 的情况下对 VecDeque 进行排序或反转?