Есть ли способ сгруппировать поля структуры при сериализации с помощью Serde, например, обратный атрибуту flatten?

Serde имеет flatten атрибут, который выравнивает один уровень структуры данных. Я хочу обратное: способ группировки атрибутов.

У меня есть структура

struct Foo {
    owner: Owner,
    alpha: Server,
    beta: Server,
}

и я хочу, чтобы серверы были сериализованы вложенным образом, например:

[owner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00 # First class dates
[servers]

  [servers.alpha]
  ip = "10.0.0.1"
  dc = "eqdc10"

  [servers.beta]
  ip = "10.0.0.2"
  dc = "eqdc10"

по умолчанию Serde будет производить:

[owner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00 # First class dates

[alpha]
ip = "10.0.0.1"
dc = "eqdc10"

[beta]
ip = "10.0.0.2"
dc = "eqdc10"

Чего я не хочу. Есть ли способ получить первый вывод YAML без рефакторинга моей структуры?


person Paul    schedule 10.06.2020    source источник


Ответы (1)


Если по какой-то причине вы не можете выполнить рефакторинг Foo, возможно, вы могли бы создать новую структуру, которая фиксирует вложенную структуру, и использовать Serde _ 2_ и into для сериализации Foo через него .

Пример

#[derive(Clone)]
#[serde(from = "IntermediateFoo", into = "IntermediateFoo")]
pub struct Foo {
    owner: Owner,
    alpha: Server,
    beta: Server,
}

impl From<Foo> for IntermediateFoo {
    /* ... */
}

impl From<IntermediateFoo> for Foo {
    /* ... */
}

#[derive(Serialize, Deserialize)]
struct IntermediateFoo {
    owner: Owner,
    servers: IntermediateServers,
}

#[derive(Serialize, Deserialize)]
struct IntermediateServers {
    alpha: Server,
    beta: Server,
}
person Emerson Harkin    schedule 17.06.2020
comment
Не реализуйте Into напрямую. Когда мне следует реализовать std :: convert :: From vs std :: convert :: Into? - person Shepmaster; 05.08.2020
comment
Спасибо, @Shepmaster, я не знал, что руководство impl Into не рекомендуется. Отредактировал соответственно. - person Emerson Harkin; 06.08.2020