Сериализация вложенных свойств в структуре не работает - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь сериализовать следующий Result объект, однако я получаю сообщение об ошибке, потому что, хотя он работает для некоторых свойств, он не работает на path, хотя всезадействованные элементы имеют реализации, предоставленные Serde .

#[macro_use]
extern crate serde;
extern crate rocket;

use rocket_contrib::json::Json;
use std::rc::Rc;

#[derive(Serialize)]
struct Result {
    success: bool,
    path: Vec<Rc<GraphNode>>,
    visited_count: u32,
}
struct GraphNode {
    value: u32,
    parent: Option<Rc<GraphNode>>,
}

fn main(){}

fn index() -> Json<Result> {
    Json(Result {
        success: true,
        path: vec![],
        visited_count: 1,
    })
}

Playground , хотя я не могу заставить его тянуть в ящик Ракеты, он не должен быть однимиз 100 самых популярных.

error[E0277]: the trait bound `std::rc::Rc<GraphNode>: serde::Serialize` is not satisfied
  --> src/main.rs:11:5
   |
11 |     path: Vec<Rc<GraphNode>>,
   |     ^^^^ the trait `serde::Serialize` is not implemented for `std::rc::Rc<GraphNode>`
   |
   = note: required because of the requirements on the impl of `serde::Serialize` for `std::vec::Vec<std::rc::Rc<GraphNode>>`
   = note: required by `serde::ser::SerializeStruct::serialize_field`

Насколько я понимаю, #[derive(Serialize)] должен автоматически создать метод сериализации, который затем может использовать serde.Однако я ожидаю, что это будет работать и для свойств.Нужно ли создавать структуры для всех типов, а затем выводить Serialize для всех этих структур?

Нужно ли что-то делать для его включения?

Используются следующие ящики:

rocket = "*" 
serde = { version = "1.0", features = ["derive"] } 
rocket_contrib = "*"

1 Ответ

0 голосов
/ 27 февраля 2019
the trait bound `std::rc::Rc<GraphNode>: serde::Serialize` is not satisfied

Это означает, что Rc не не реализует Serialize.См. Как мне сериализовать или десериализовать Arc в Серде? .TL; DR:

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

После добавления этого сообщения об ошибке меняется на:

error[E0277]: the trait bound `GraphNode: serde::Serialize` is not satisfied
  --> src/main.rs:11:5
   |
11 |     path: Vec<Rc<GraphNode>>,
   |     ^^^^ the trait `serde::Serialize` is not implemented for `GraphNode`
   |
   = note: required because of the requirements on the impl of `serde::Serialize` for `std::rc::Rc<GraphNode>`
   = note: required because of the requirements on the impl of `serde::Serialize` for `std::vec::Vec<std::rc::Rc<GraphNode>>`
   = note: required by `serde::ser::SerializeStruct::serialize_field`

Это потому, что каждый тип, который должен быть сериализован, должен реализовывать Serialize:

#[derive(Serialize)]
struct GraphNode {
...