Deserialization of enum variant which recursively refers to itself failed with stackoverflow
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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
- Lingua principale
- Rust
- Stelle
- 1.6k
- Fork
- 299
- Merge medio
- 2g 4h
- PR unite (30g)
- 9
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di tafia/quick-xml
-
Parser accepts an empty element or attribute nameForse già presa @ychampion l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
DecodingReader::set_encoding panics when the XML declaration is longer than 64 bytesForse già presa @emschwartz l’ha presa 4 giorni fa. Apertabug encoding
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
tafia/quick-xml#1040 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
encoding optimization
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
tafia/quick-xml#1039 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
optimization question
Difficoltà 4/5 3-5 giorni Idoneità per principianti 52/100
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 4/5 1-2 giorni Idoneità per principianti 53/100
tafia/quick-xml#1035 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di tafia/quick-xml
Issue simili
-
[Bug]: opencode_go chat route drops reasoning_effort (even 'none'), while the same endpoint honors it via custom_llm_provider=openaiForse già presa @arvindkumar-ship-it l’ha presa oggi. Apertallm translation
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
BerriAI/litellm#51871 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
comp-formats
Difficoltà 2/5 Mezza giornata Idoneità per principianti 64/100
ClickHouse/ClickHouse#131694 ·
I maintainer di solito rispondono entro 1 giorno
-
cli: `execCargoMetadata` decodes stdout per chunk, corrupting non-ASCII paths across pipe boundariesAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
C-Bug S-Needs-Triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
bevyengine/bevy#26558 ·
I maintainer di solito rispondono entro 2 giorni