NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2014 most downloaded on crates.io
A library for working with Apache Avro in Rust
Last release 1 months ago
10 Aug 2026
Ships fairly regularly
a new release about every 6 months
Some releases are documented
notes for 5 of 10 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
10 releases · first in 2022
One column per quarter.
The Apache Avro Rust SDK 0.22.0 release is a large release with lots of features, fixes and breaking changes. It is strongly recommended to read the B…
The Apache Avro Rust SDK 0.22.0 release is a large release with lots of features, fixes and breaking changes. It is strongly recommended to read the Breaking changes and New features sections of the changelog.
Writer by @Kriskras99 in #328
AvroResultSchemaCompatiblity::can_read and SchemaCompatiblity::mutual_read now return a Compatiblity typeSchema::Duration now has a FixedSchema allowing access to attributes and Serialize and Deserialize is implemented for apache_avro::Duration by @jdarais in #382AvroSchema and AvroSchemaComponent are no longer behind the derive feature and have moved from apache_avro::schema::derive to apache_avro::serde by @martin-g in #394 and @Kriskras99 in #433AvroSchemaComponent for Uuid from Schema::Uuid(String) to Schema::Uuid(Fixed(name: "org.apache.avro.rust.Uuid", size: 16)) and allow overwriting a field's schema with the with attribute when using #[derive(AvroSchema)] by @Kriskras99 in #397, #558
#[avro(with)] is specified without an argument, it will call the get_schema_in_ctxt(&mut HashSet<Name>, NamespaceRef<'_>) -> Schema in the same module as specified by #[serde(with)]#[avro(with = path::to::some_fn)] is specified with a path, the function it's pointing to will be called with two parameters &mut HashSet<Name>, NamespaceRef<'_>#[avro(with = || {})] is specified with a closure, that closure is invokeduuid::Uuid is org.apache.avro.rust.uuidUuid can be changed back to a Schema::Uuid(String) using #[avro(with = || Schema::Uuid(UuidSchema::String))] on a field with a Uuid and setting human_readable to trueFrom<&str> implementations for Name and Alias with TryFrom<&str>, TryFrom<String>, and FromStr as the conversion is not fallible by @Kriskras99 in #423SpecificSingleObjectWriter removing ::with_capacity and changing write_avro_datum_ref to also take a &NamesRef parameter by @Kriskras99 in #445default field from FixedSchema as it is not in the specification by @Kriskras99 in #460AvroSchemaComponent::get_schema_in_ctxt now takes a &mut HashSet<Name> parameter for the named_schemas parameter by @Kriskras99 in #471Schema::map{,_with_attributes} and Schema::array{,_with_attributes} with builders allowing the user to set more fields by @martin-g in #472
Schema::r#enum, Schema::fixed and Schema::recordAlias::name and Alias::namespace now return references by @Kriskras99 in #486order and position fields in RecordField by @Kriskras99 in #491Name to be more performant which requires changing the SchemaNameValidator trait by @Kriskras99 in #493
SchemaNameValidator::regex must have a capture group named name which captures the unqualified name when not overriding the SchemaNameValidator::validate functionSchemaNameValidator::validate must now return the start byte of the unqualified nameSchemaAwareSerializer, implement SchemaAwareDeserializer and document the mapping between the Serde and Avro data models by @Kriskras99 in #512, #558
SchemaAware* now have specific requirements for what input they accept, so type definitions might need to be modified to make them work with the new code (especially for enums and tuples)human_readable configurable per reader and writer instanceAvroSchemaComponent implementation for std::time::Duration has changed to match the (de)serialisation implementation as defined by Serde
Schema::Record(name: "org.apache.avro.rust.Duration", fields: ["secs": "org.apache.avro.rust.u64", "nanos": "long"])AvroSchemaComponent implementation for BigDecimal is now a Schema::String matching the (de)serialisation implementation as defined by bigdecimal
Schema::String using #[serde(with = "apache_avro::serde::bigdecimal"), avro(with)] on a field with a BigDecimalSchemaAwareDeserializer does not support schema resolution, for that use the old from_value implementation (see #575)DeflateSettings::compression_level public by @EmilyMatt in #335fixed as a type for uuid by @Kriskras99 in #339#[serde(flatten)] attribute by @Kriskras99 in #359, #448
apache_avro::serde::to_value#[avro(name = "..")] -> #[serde(rename = "..")]#[avro(rename_all = "..")] -> #[serde(rename_all = "..")]#[avro(rename = "..")] -> #[serde(rename = "..")]#[avro(alias = "..")] -> #[serde(alias = "..")]#[avro(rename = "..")] -> #[serde(rename = "..")]#[avro(skip)] -> #[serde(skip)]#[serde(transparent)] attribute on structs by @Kriskras99 in #398AvroSchemaComponent for char, u64, u128, i128, () by @Kriskras99 in #414, #486, #558
char: Schema::Stringu64: Schema::Fixed(name: "org.apache.avro.rust.u64", size: 8)u128: Schema::Fixed(name: "org.apache.avro.rust.u128", size: 16)i128: Schema::Fixed(name: "org.apache.avro.rust.i128", size: 16)(): Schema::NullRecordSchemaBuilder::try_name which accepts any TryInto<Name> and make RecordFieldBuilder::name take any Into<String> by @martin-g in #429serde_avro_* modules to apache_avro::serde::*, the old modules are still available but deprecated and will be removed in a future release by @Kriskras99 in #430
apache_avro::serde_avro_bytes -> apache_avro::serde::bytesapache_avro::serde_avro_bytes_opt -> apache_avro::serde::bytes_optapache_avro::serde_avro_fixed -> apache_avro::serde::fixedapache_avro::serde_avro_fixed_opt -> apache_avro::serde::fixed_optapache_avro::serde_avro_slice -> apache_avro::serde::sliceapache_avro::serde_avro_slice_opt -> apache_avro::serde::slice_optWriter::append to Writer::append_value although the old function currently still exists and is deprecatedWriter::unvalidated_append_value and Writer::unvalidated_append_value_ref which skip the validation stepdocumentation::primer moduledocumentation::generic moduleserde moduleSchema::fingerprint functionvalidator moduleschema_equality module#[derive(AvroSchema)] in the serde moduleboolean type when a schema contains a type named bool that does not resolve by @Kriskras99 in #459Writer backed by a clearable buffer by @Kriskras99 in #469Schema::denormalize public by @Kriskras99 in #470AvroSchemaComponent to provide a default value by @Kriskras99 in #477Debug implementations for *Schema types hiding empty fields for more readability by @Kriskras99 in #488UnionSchemaBuilder by @Kriskras99 in #486from_avro_datum* functions with GenericDatumReader by @Kriskras99 in #496
to_datum* functions with GenericDatumWriter by @Kriskras99 in #499
#[serde(remote = "..")] by @Kriskras99 in #564AvroSchema on enums and tuples by @Kriskras99 in #569
Value::resolve and Value::Validate by @Kriskras99 in #579Option<Enum> by @PookieBuns in #337BigDecimal fields when using "the Serde way" by @eft-prima in #338avro.codec attribute if the codec is Null by @Kriskras99 in #356Value::Long into a Value::Int no longer truncates and returns an error instead by @Kriskras99 in #392logicalType is no longer included in custom attributes by @jdarais in #395RecordSchema lookup table on RecordSchemaBuilder::build() by @martin-g in #411UnionSchema::new no longer accepts multiple schemas with the same name by @marting-g in #413Schema::independent_canonical_form by @Kriskras99 in #420SpecificSingleObjectWriter writes header on every call by @flxo in #438bytes as a Uuid::String by @Kriskras99 in #441i64::MAX when converting from JSON by @Kriskras99 in #450CHANGELOG.md by @martin-g in #541BigDecimal in Deserializer when apache_avro::serde::bigdecimal is used by @jdarais in #543Value::Map and Value::Array to the max allocation size by @iemejia in #581test_overflow test to actually test for overflow by @Kriskras99 in #357std feature for Serde by @Kriskras99 in #364
avro crate but not when building only the avro_derive crateavro_derive/tests/derive.rs by @Kriskras99 in #375TestResult by @martin-g in #393schema.rs in various modules by @martin-g in #405, #409, #410, #412, #415, #417Deserializer by @Kriskras99 in #416Serializer by @Kriskras99 in #428reader.rs into various modules by @martin-g in #474, #475, #478writer.rs into various modules by @Kriskras99 in #497, #498AvroSchema derive generated code by @Kriskras99 in #501cargo doc by @martin-g in #507-Dclippy::pedantic by @martin-g in #514Alias::new() and Parser::fix_aliases_namespace by @Kriskras99 in #557github/codeql-action/* updates by @Kriskras99 in #592dtolnay/rust-toolchain with manual rustup calls by @martin-g in #596features = ["derive"] on strum by @Kriskras99 in #483Note truncated.
chore: silence deprecation warning for generic-array by @Kriskras99 in #324
Once with now stable OnceLock by @Kriskras99 in #259Option<String> field with a #[avro(default = "null")] by @martin-g in #260is_human_readable to false by @Kriskras99 in #325Full Changelog: rel/release-0.20.0...rel/release-0.21.0-rc0
chore: Remove deprecated items in 0.11.0 and 0.15.0 by @martin-g in #236
#[automatically_derived] attribute to the auto generated impls by @martin-g in #211serde as a feature for bigdecimal decimal by @martin-g in #221Writer::flush. by @Kriskras99 in #222Error into a Box so it's size shrinks from 104 bytes to 8 bytes by @Kriskras99 in #230Full Changelog: rel/release-0.19.0...rel/release-0.20.0
feat: Add settings for Codec::Deflate by @martin-g in #174
Schema::parse_(str_with)_list by @Kriskras99 in #195get_ref and get_mut methods to Writer by @Kriskras99 in #201Full Changelog: rel/release-0.18.0...rel/release-0.19.0
chore: Update repository and remove deprecated authors field by @Xuanwo in #5
use abc to replace extern crate abc by @Xuanwo in #7flush on the inner writer during Writer::flush by @snowsignal in #14cargo check errors with 1.83.0 (stable) by @martin-g in #65serial_test for the test from issue #53 by @martin-g in #72Schema::parse_str_with_list to parse root schemas with references by @rayokota in #104parse_str_with_list by @rayokota in #105Record::get(str) - getter for record fields by @splix in #130Note truncated.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →