You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Feature request: SchemaAwareResolvingDeserializer — direct-to-type schema evolution without the intermediate Value #575
First of all, thank you very much for your work on avro-rs! The SchemaAwareDeserializer introduced in #512 is a great addition.
I would like to kindly ask about the status of the resolving counterpart to that deserializer. Today, SchemaAwareDeserializer decodes directly into T only when the reader schema matches the writer schema. As soon as a reader schema differs , the serde path deliberately bails out with a todo!/panic!, pointing at a not-yet-implemented SchemaAwareResolvingDeserializer.
I haven't found a tracking ticket for this.
Where this shows up in the code
The gap is marked with three matching TODOs on main(pinned to 660c655cac0cdf3bc5c6818bf6b5e445eb09bdce):
// TODO: Implement SchemaAwareResolvingDeserializerpanic!("Schema aware deserialisation does not resolve schemas yet");
The non-resolving deserializer itself lives in avro/src/serde/deser_schema/mod.rs and carries a single schema, doing no writer→reader resolution.
Why it matters
Currently, schema evolution is only available on the Value route: decode to Value against the writer schema, then Value::resolve* against the reader schema, then optionally from_value::<T>(). This allocates a full Value tree (and, without a cached ResolvedSchema, a fresh name map) per record — precisely the overhead the schema-aware deserializer was designed to avoid. A resolving deserializer would close that gap and, as noted in the #512 description, could eventually allow deprecating from_value / to_value entirely.
Request
Would you be willing to share the implementation state of a SchemaAwareResolvingDeserializer?
I completely understand this is volunteer-maintained work and that priorities and timelines shift; please take this only as gentle interest, not pressure!
It's 80% done, but the remaining 20% is the hard part. But it has been on hold while I have been working on avro_derive. I don't expect it to make it into the 0.22 release.
It's 80% done, but the remaining 20% is the hard part. But it has been on hold while I have been working on avro_derive. I don't expect it to make it into the 0.22 release.
hey! we'd love to use this in iceberg-rust 😄 right now we have a stopgap adapter (Resolved<T>) that does part of the resolution ourselves, and this would let us drop it.
this would also match Java Avro. SpecificDatumReader(writer, reader) resolves while decoding straight into the target type through ResolvingDecoder, no intermediate generic values.
one ask: could it keep ignoring record names when resolving records, like Value::resolve does today? Java does the same, Resolver.RecordAdjustskips the record name check on purpose for compatibility. The Iceberg spec doesn't define Avro record names, so we'd rather not depend on them when reading manifests.
Activity
Kriskras99 commentedon Jul 5, 2026
It's 80% done, but the remaining 20% is the hard part. But it has been on hold while I have been working on
avro_derive. I don't expect it to make it into the 0.22 release.flxo commentedon Jul 6, 2026
Nice. Thanks!
Shall we keep this issue open as reference?
kevinjqliu commentedon Oct 15, 2026
hey! we'd love to use this in iceberg-rust 😄 right now we have a stopgap adapter (
Resolved<T>) that does part of the resolution ourselves, and this would let us drop it.this would also match Java Avro.
SpecificDatumReader(writer, reader)resolves while decoding straight into the target type throughResolvingDecoder, no intermediate generic values.one ask: could it keep ignoring record names when resolving records, like
Value::resolvedoes today? Java does the same,Resolver.RecordAdjustskips the record name check on purpose for compatibility. The Iceberg spec doesn't define Avro record names, so we'd rather not depend on them when reading manifests.context: apache/iceberg-rust#3354 and apache/iceberg-rust#3466