11package kafka
22
3+ import (
4+ "encoding/json"
5+
6+ "github.com/hamba/avro/v2"
7+ )
8+
39type AvroSerde struct {
410 Serdes
511}
@@ -11,12 +17,19 @@ func (*AvroSerde) Serialize(data interface{}, schema *Schema) ([]byte, *Xk6Kafka
1117 return nil , err
1218 }
1319
14- encodedData , _ , originalErr := schema .Codec (). NativeFromTextual ( jsonBytes )
15- if originalErr ! = nil {
16- return nil , NewXk6KafkaError (failedToEncode , "Failed to encode data " , originalErr )
20+ avroSchema := schema .Codec ()
21+ if avroSchema = = nil {
22+ return nil , NewXk6KafkaError (failedToEncode , "Failed to parse Avro schema " , nil )
1723 }
1824
19- bytesData , originalErr := schema .Codec ().BinaryFromNative (nil , encodedData )
25+ // Parse JSON data into a map for marshaling
26+ var jsonData interface {}
27+ if jsonErr := json .Unmarshal (jsonBytes , & jsonData ); jsonErr != nil {
28+ return nil , NewXk6KafkaError (failedToEncode , "Failed to parse JSON data" , jsonErr )
29+ }
30+
31+ // Marshal to binary using hamba/avro
32+ bytesData , originalErr := avro .Marshal (avroSchema , jsonData )
2033 if originalErr != nil {
2134 return nil , NewXk6KafkaError (failedToEncodeToBinary ,
2235 "Failed to encode data into binary" ,
@@ -28,7 +41,13 @@ func (*AvroSerde) Serialize(data interface{}, schema *Schema) ([]byte, *Xk6Kafka
2841
2942// Deserialize deserializes a Avro binary into a JSON object.
3043func (* AvroSerde ) Deserialize (data []byte , schema * Schema ) (interface {}, * Xk6KafkaError ) {
31- decodedData , _ , err := schema .Codec ().NativeFromBinary (data )
44+ avroSchema := schema .Codec ()
45+ if avroSchema == nil {
46+ return nil , NewXk6KafkaError (failedToDecodeFromBinary , "Failed to parse Avro schema" , nil )
47+ }
48+
49+ var decodedData interface {}
50+ err := avro .Unmarshal (avroSchema , data , & decodedData )
3251 if err != nil {
3352 return nil , NewXk6KafkaError (
3453 failedToDecodeFromBinary , "Failed to decode data" , err )
@@ -37,6 +56,6 @@ func (*AvroSerde) Deserialize(data []byte, schema *Schema) (interface{}, *Xk6Kaf
3756 if data , ok := decodedData .(map [string ]interface {}); ok {
3857 return data , nil
3958 } else {
40- return nil , ErrInvalidDataType
59+ return decodedData , nil
4160 }
4261}
0 commit comments