首页 > 解决方案 > 使用 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 输出?

标签: rustserde

解决方案


如果Foo由于某种原因无法重构,也许您可​​以创建一个新的结构来捕获嵌套结构并使用 Serdefrominto属性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,
}

推荐阅读