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)