【问题标题】:Using #[serde(serialize_with...] and #[derive(Serialize)] does not work使用 #[serde(serialize_with...] 和 #[derive(Serialize)] 不起作用
【发布时间】:2020-06-18 14:39:19
【问题描述】:

我正在尝试覆盖结构中单个字段的序列化,但仍使用默认的序列化器。我遇到了一些问题。

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...] 行,它将编译

【问题讨论】:

    标签: rust serde


    【解决方案1】:

    第一个参数必须是引用:

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

    Playground

    附:您必须从相反的方向阅读这种错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      相关资源
      最近更新 更多