[
https://issues.apache.org/jira/browse/AVRO-3821?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Martin Tzvetanov Grigorov resolved AVRO-3821.
---------------------------------------------
Fix Version/s: 1.12.0
1.11.3
Resolution: Fixed
> Rust: Record (de?)serialization is sensitive to order of fields in struct
> -------------------------------------------------------------------------
>
> Key: AVRO-3821
> URL: https://issues.apache.org/jira/browse/AVRO-3821
> Project: Apache Avro
> Issue Type: Bug
> Components: rust
> Reporter: Renar Narubin
> Assignee: Martin Tzvetanov Grigorov
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.12.0, 1.11.3
>
> Time Spent: 20m
> Remaining Estimate: 0h
>
> A previous issue describes a bug where record validation failed due to a
> struct's field declaration order not matching its schema:
> https://issues.apache.org/jira/browse/AVRO-3495
>
> That issue's fix appears to be incomplete. Validation during writing works,
> however the written records cannot be read back - it appears that the fields
> are mismatched during deserialization. I've reproduced using the existing
> `avro_old_issue_47` test case with a modification to read the data back:
>
> {code:java}
> diff --git a/lang/rust/avro/tests/schema.rs b/lang/rust/avro/tests/schema.rs
> index 00be0ab01..d5b1ee904 100644
> --- a/lang/rust/avro/tests/schema.rs
> +++ b/lang/rust/avro/tests/schema.rs
> @@ -18,6 +18,7 @@
> use std::io::{Cursor, Read};
>
> use apache_avro::{
> + from_avro_datum, from_value,
> schema::{EnumSchema, FixedSchema, Name, RecordField, RecordSchema},
> to_avro_datum, to_value,
> types::{Record, Value},
> @@ -1452,7 +1453,7 @@ fn avro_old_issue_47() -> TestResult {
>
> use serde::{Deserialize, Serialize};
>
> - #[derive(Deserialize, Serialize)]
> + #[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
> pub struct MyRecord {
> b: String,
> a: i64,
> @@ -1463,7 +1464,15 @@ fn avro_old_issue_47() -> TestResult {
> a: 1,
> };
>
> - let _ = to_avro_datum(&schema, to_value(record)?)?;
> + let serialized_bytes = to_avro_datum(&schema,
> to_value(record.clone())?)?;
> +
> + let deserialized_record = from_value::<MyRecord>(&from_avro_datum(
> + &schema,
> + &mut Cursor::new(serialized_bytes),
> + None,
> + )?)?;
> +
> + assert_eq!(record, deserialized_record);
> Ok(())
> }
>
> {code}
> This fails as written, and passes if `a` and `b` are swapped in the MyRecord
> definition.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)