使用 #[serde(serialize_with...] 和 #[derive(Serialize)] 不起作用

Using #[serde(serialize_with...] and #[derive(Serialize)] does not work

我试图覆盖结构中单个字段的序列化,但仍使用默认的序列化程序。我 运行 遇到了一些问题。

extern crate serde;

use serde::{
    ser::{SerializeMap, Serializer},
    Serialize,
};

pub fn ser_with<S>(id: String, s: S) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    let mut ser = s.serialize_map(Some(1))?;
    ser.serialize_entry("$oid", &id)?;
    ser.end()
}

#[derive(Debug, Serialize)]
pub struct Concept {
    #[serde(serialize_with = "ser_with")]
    pub universe_id: String,
    pub display_name: String,
}

fn main() {
    println!("Hello, world!");
}

编译器错误:

  --> src/main.rs:17:17
   |
17 | #[derive(Debug, Serialize)]
   |                 ^^^^^^^^^
   |                 |
   |                 expected struct `std::string::String`, found `&std::string::String`
   |                 help: try using a conversion method: `Serialize.to_string()`

error: aborting due to previous error

Cargo.toml

[package]
name = "serde_bug"
version = "0.1.0"
authors = []
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
serde = { version = "1.0", features = ["derive"] }

如果我删除 #[serde(serialize_with...] 行,它将编译

第一个参数必须是引用:

pub fn ser_with<S>(id: &str, s: S) -> Result<S::Ok, S::Error>

Playground

P.S。那种反方向的错误你得去读。