在反序列化时,使用 serde 将外部字符串引用 ( IDs / "foreign keys" ) 解析为同一文档中其他地方存在的结构
Resolving external string references ( IDs / "foreign keys" ) to structs present elsewhere in the same document, at deserialization time, with serde
我有 Context
个对象 - 本质上是 Cluster
和 User
之间的连接记录 - 在 kubernetes 配置 yaml ( ~/.kube/config ) i'我想解析成一个看起来像这样的结构:
struct Context {
name: String,
cluster: Cluster,
user: User
}
struct Cluster {
server: String
// ..
}
struct User {
name: String,
// ..
}
yaml 本身将这些编码为单独的数组,例如:
contexts:
- name: some_context
context:
cluster: some_cluster
user: some_user
clusters:
- name: some_cluster
cluster:
// many other, important fields ..
users:
- name: some_user
user:
// many other, important fields ..
我什至不知道从哪里开始 - 似乎我需要先访问文档的临时表示,然后才能“向前看”以解析其他部分的一些复杂结构Context
外部的这些结构中的文档
我发现首选的 kubernetes 客户端 crate 正在解析这个确切的文件,但它回避这样做,只提供“原始”字符串键
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Context {
pub cluster: String, // ideally cluster: Cluster
pub user: String, // ideally user: User
pub namespace: Option<String>,
pub extensions: Option<Vec<NamedExtension>>,
}
(我在上面的片段中发表评论)
是否有关于如何执行此 serde 的示例?
我想了很久,这可能不在 serde 的范围内。我目前确实找不到办法。
相反,我在具有字符串 id 引用的低级类型(直接来自 serde)和我的高级类型之间实现了一个 TryFrom
,这些引用已解析。
我有 Context
个对象 - 本质上是 Cluster
和 User
之间的连接记录 - 在 kubernetes 配置 yaml ( ~/.kube/config ) i'我想解析成一个看起来像这样的结构:
struct Context {
name: String,
cluster: Cluster,
user: User
}
struct Cluster {
server: String
// ..
}
struct User {
name: String,
// ..
}
yaml 本身将这些编码为单独的数组,例如:
contexts:
- name: some_context
context:
cluster: some_cluster
user: some_user
clusters:
- name: some_cluster
cluster:
// many other, important fields ..
users:
- name: some_user
user:
// many other, important fields ..
我什至不知道从哪里开始 - 似乎我需要先访问文档的临时表示,然后才能“向前看”以解析其他部分的一些复杂结构Context
我发现首选的 kubernetes 客户端 crate 正在解析这个确切的文件,但它回避这样做,只提供“原始”字符串键
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Context {
pub cluster: String, // ideally cluster: Cluster
pub user: String, // ideally user: User
pub namespace: Option<String>,
pub extensions: Option<Vec<NamedExtension>>,
}
(我在上面的片段中发表评论)
是否有关于如何执行此 serde 的示例?
我想了很久,这可能不在 serde 的范围内。我目前确实找不到办法。
相反,我在具有字符串 id 引用的低级类型(直接来自 serde)和我的高级类型之间实现了一个 TryFrom
,这些引用已解析。