-
Notifications
You must be signed in to change notification settings - Fork 252
Add ability to deserialize serde types from Reader
#611
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Having a The possible API could look something like this: impl<'a> Reader<&'a [u8]> {
fn deserialize<T>(&mut self, seed: Event<'a>) -> Result<T, DeError>
where
T: Deserialize<'a>,
{}
}
impl<R: Read> Reader<R> {
fn deserialize_into<'de, T>(&mut self, seed: Event<'de>, buffer: &'de mut Vec<u8>) -> Result<T, DeError>
where
T: Deserialize<'de>,
{}
} The Another possible API (very schematic): impl<R> Reader<R> {
fn deserializer(&mut self, seed: Event) -> FragmentDeserializer { ... }
}
struct FragmentDeserializer { ... }
impl FragmentDeserializer {
fn deserialize<T>(self) -> Result<T, DeError>
where
T: Deserialize<'a>,
{}
fn deserialize_into<'de, T>(self, buffer: &'de mut Vec<u8>) -> Result<T, DeError>
where
T: Deserialize<'de>,
{}
} Another question, in what state we should leave impl<R> Reader<R> {
/// Convert to a reader that can store up to `count` events in the internal buffer
fn lookahead(self, count: usize) -> LookaheadReader<R> { ... }
}
impl<'de, 'a, R> Deserializer<'de> for &'a mut LookaheadReader<R> { ... } |
It is not trivial to do that, because we cannot just reuse |
Reader
I would also like this. Go makes it easy to mix pull based parsing with a state machine and deserializing structs: decoder := xml.NewDecoder(r.Body)
decoder.Strict = true
for {
switch se := t.(type) {
case xml.StartElement:
level++
switch se.Name.Local {
case "fooTag":
var req schema.FooRequest
decoder.DecodeElement(&req, &se)
// do stuff
case "barRequest":
var req schema.BarRequest
err = decoder.DecodeElement(&req, &se)
// do stuff
}
case xml.EndElement:
level--
}
}
} I could live with an implementation that ties the lifetime of the Reader and the deserialized object to the source lifetime, i.e. only applies to readers backed by a |
By any chance is it possible to implement something like:
for I would like to deserialize some specific |
As I already explained, serde deserializer requires lookahead which
|
Cool! |
When working with deeply nested xml, most of the time, we are only interested in a portion of the whole tree close to the leaf node. My idea is to extract the string of the target node and deserialize it with serde. But I can't find any convenient way to do that.
Currently I use
read_text
to get the inner content of the node and add the start and end tag manually, but then the code looks really weird, especially when the node has many attributes. It would be great if there's a method (read_node
or something) to do that.By the way, is there any reason why
read_text
is not implemented forReader<File>
?The text was updated successfully, but these errors were encountered: