You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Renar Narubin (Jira)" <ji...@apache.org> on 2023/08/02 20:49:00 UTC
[jira] [Created] (AVRO-3821) Rust: Record (de?)serialization is sensitive to order of fields in struct
Renar Narubin created AVRO-3821:
-----------------------------------
Summary: 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
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)