【问题标题】:Is there a way to group fields of a struct when serializing with Serde, like the inverse of the "flatten" attribute?使用 Serde 进行序列化时,有没有办法对结构的字段进行分组,例如“flatten”属性的反转?
【发布时间】:2020-08-06 21:26:41
【问题描述】:

Serde 有一个flatten attribute,它扁平化了一层数据结构。我想要反过来:一种对属性进行分组的方法。

我有结构

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 输出?

【问题讨论】:

    标签: rust serde


    【解决方案1】:

    如果由于某种原因不能重构Foo,也许你可以创建一个新的结构来捕获嵌套结构并使用Serde frominto 属性通过它序列化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,
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    相关资源
    最近更新 更多