Использование # [serde (serialize_with ...] и # [Derve (Serialize)] не работает - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь переопределить сериализацию одного поля в структуре, но все еще использую Сериализатор по умолчанию. Я сталкиваюсь с некоторыми проблемами.

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

Автомобиль go .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 ...] будет скомпилирована

1 Ответ

2 голосов
/ 06 марта 2020

Первый параметр должен быть ссылкой:

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

Детская площадка

PS Вы должны прочитать ошибки такого рода в обратном направлении.

...