Deserialization of enum variant which recursively refers to itself failed with stackoverflow
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 35/100
Research direction
The report includes a Rust reproduction using from_str::<MathNode> and recursive enum variants. Start by reading the XML deserialization path for enum newtype variants and compare it with the struct variant behavior shown in the issue. Done means the newtype form deserializes the sample without overflowing the stack; the issue names no test file or implementation entry point.
Written by the indexing model from the issue text.
Description
Found in https://stackoverflow.com/questions/67932584/deserializing-recursive-xml-using-serde-in-rust
Currently recursively defined enums using newtype variants for recursion lead to stack overflow error:
#[test]
fn recursive() {
#[derive(Debug, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
enum MathNode {
Apply(Vec<MathNode>),
Ci(Vec<MathNode>),
#[serde(rename = "$text")]
Text(String),
#[serde(rename = "math")]
Root(Vec<MathNode>),
}
let test = r#"
<math>
<apply>
<ci type="integer">5</ci>
</apply>
</math>"#;
assert_eq!(
from_str::<MathNode>(test).unwrap(),
MathNode::Root(vec![MathNode::Apply(vec![MathNode::Ci(vec![
MathNode::Text("5".into())
])])])
);
}
However, if change newtype variant to the struct variant with one $value field, everything works:
#[test]
fn recursive() {
#[derive(Debug, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
enum MathNode {
Apply {
#[serde(rename = "$value")]
value: Vec<MathNode>,
},
Ci {
#[serde(rename = "$value")]
value: Vec<MathNode>,
},
#[serde(rename = "$text")]
Text(String),
#[serde(rename = "math")]
Root {
#[serde(rename = "$value")]
value: Vec<MathNode>,
},
}
let test = r#"
<math>
<apply>
<ci type="integer">5</ci>
</apply>
</math>"#;
assert_eq!(
from_str::<MathNode>(test).unwrap(),
MathNode::Root {
value: vec![MathNode::Apply {
value: vec![MathNode::Ci {
value: vec![MathNode::Text("5".into())]
}],
}],
}
);
}
It seems worth to implement newtype variant deserialization like such structs
- Dominant language
- Rust
- Stars
- 1.6k
- Forks
- 299
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 9
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from tafia/quick-xml
-
Parser accepts an empty element or attribute namePossibly taken @ychampion claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day
-
DecodingReader::set_encoding panics when the XML declaration is longer than 64 bytesPossibly taken @emschwartz claimed this 4 days ago. Openbug encoding
Difficulty 4/5 3-5 days Newbie friendliness 30/100
tafia/quick-xml#1040 · 1 comment ·
Maintainers usually reply within 1 day
-
encoding optimization
Difficulty 4/5 3-5 days Newbie friendliness 55/100
tafia/quick-xml#1039 · 1 comment ·
Maintainers usually reply within 1 day
-
optimization question
Difficulty 4/5 3-5 days Newbie friendliness 52/100
Maintainers usually reply within 1 day
-
enhancement
Difficulty 4/5 1-2 days Newbie friendliness 53/100
tafia/quick-xml#1035 · 1 comment ·
Maintainers usually reply within 1 day
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
storytold/photocraft#14822 ·
Maintainers usually reply within 1 day
-
bug css
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
dginev/latexml-oxide#853 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
Maintainers usually reply within 2 days
-
[Bug] export_build_environment admits its output directory only after the export ran in the build computerPossibly taken @viniciusdsandrade claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day