@@ -55,7 +55,7 @@ public class PowertoolsKafkaAvroSerializer : PowertoolsKafkaSerializerBase
5555 public PowertoolsKafkaAvroSerializer ( ) : base ( )
5656 {
5757 }
58-
58+
5959 /// <summary>
6060 /// Initializes a new instance of the <see cref="PowertoolsKafkaAvroSerializer"/> class
6161 /// with custom JSON serialization options.
@@ -64,7 +64,7 @@ public PowertoolsKafkaAvroSerializer() : base()
6464 public PowertoolsKafkaAvroSerializer ( JsonSerializerOptions jsonOptions ) : base ( jsonOptions )
6565 {
6666 }
67-
67+
6868 /// <summary>
6969 /// Initializes a new instance of the <see cref="PowertoolsKafkaAvroSerializer"/> class
7070 /// with a JSON serializer context for AOT-compatible serialization.
@@ -73,62 +73,41 @@ public PowertoolsKafkaAvroSerializer(JsonSerializerOptions jsonOptions) : base(j
7373 public PowertoolsKafkaAvroSerializer ( JsonSerializerContext serializerContext ) : base ( serializerContext )
7474 {
7575 }
76-
77- /// <summary>
78- /// Gets the Avro schema for the specified type.
79- /// The type must have a public static _SCHEMA field defined.
80- /// </summary>
81- /// <param name="payloadType">The type to get the Avro schema for.</param>
82- /// <returns>The Avro Schema object.</returns>
83- /// <exception cref="InvalidOperationException">Thrown if no schema is found for the type.</exception>
84- [ RequiresDynamicCode ( "Avro schema access requires reflection which may be incompatible with AOT." ) ]
85- [ RequiresUnreferencedCode ( "Avro schema access requires reflection which may be incompatible with trimming." ) ]
86- private Schema ? GetAvroSchema ( [ DynamicallyAccessedMembers ( DynamicallyAccessedMemberTypes . PublicFields ) ] Type payloadType )
87- {
88- var schemaField = payloadType . GetField ( "_SCHEMA" ,
89- BindingFlags . Public | BindingFlags . Static ) ;
90-
91- if ( schemaField == null )
92- return null ;
93-
94- return schemaField . GetValue ( null ) as Schema ;
95- }
9676
9777 /// <summary>
9878 /// Deserializes complex (non-primitive) types using Avro format.
79+ /// Requires types to have a public static _SCHEMA field.
9980 /// </summary>
100- /// <param name="data">The binary data to deserialize.</param>
101- /// <param name="targetType">The type to deserialize to.</param>
102- /// <param name="isKey">Whether this data represents a key (true) or a value (false).</param>
103- /// <returns>The deserialized object.</returns>
10481 [ RequiresDynamicCode ( "Avro deserialization might require runtime code generation." ) ]
10582 [ RequiresUnreferencedCode ( "Avro deserialization might require types that cannot be statically analyzed." ) ]
106- protected override object ? DeserializeComplexTypeFormat ( byte [ ] data ,
107- [ DynamicallyAccessedMembers ( DynamicallyAccessedMemberTypes . PublicFields ) ]
108- Type targetType , bool isKey )
83+ protected override object ? DeserializeComplexTypeFormat ( byte [ ] data ,
84+ [ DynamicallyAccessedMembers ( DynamicallyAccessedMemberTypes . PublicFields ) ]
85+ Type targetType , bool isKey , SchemaMetadata ? schemaMetadata = null )
10986 {
110- try
87+ var schema = GetAvroSchema ( targetType ) ;
88+ if ( schema == null )
11189 {
112- // Try to get Avro schema for the type
113- var schema = GetAvroSchema ( targetType ) ;
114-
115- if ( schema != null )
116- {
117- using var stream = new MemoryStream ( data ) ;
118- var decoder = new BinaryDecoder ( stream ) ;
119- var reader = new SpecificDatumReader < object > ( schema , schema ) ;
120- return reader . Read ( null ! , decoder ) ;
121- }
122-
123- // If no Avro schema was found, throw an exception
124- throw new InvalidOperationException ( $ "Unsupported type for Avro deserialization: { targetType . Name } . " +
125- "Avro deserialization requires a type with a static _SCHEMA field. " +
126- "Consider using an alternative Deserializer." ) ;
127- }
128- catch ( Exception ex )
129- {
130- // Preserve the error message while wrapping in SerializationException for consistent error handling
131- throw new System . Runtime . Serialization . SerializationException ( $ "Failed to deserialize { ( isKey ? "key" : "value" ) } data: { ex . Message } ", ex ) ;
90+ throw new InvalidOperationException (
91+ $ "Unsupported type for Avro deserialization: { targetType . Name } . " +
92+ "Avro deserialization requires a type with a static _SCHEMA field. " +
93+ "Consider using an alternative Deserializer." ) ;
13294 }
95+
96+ using var stream = new MemoryStream ( data ) ;
97+ var decoder = new BinaryDecoder ( stream ) ;
98+ var reader = new SpecificDatumReader < object > ( schema , schema ) ;
99+ return reader . Read ( null ! , decoder ) ;
100+ }
101+
102+ /// <summary>
103+ /// Gets the Avro schema for the specified type from its static _SCHEMA field.
104+ /// </summary>
105+ [ RequiresDynamicCode ( "Avro schema access requires reflection." ) ]
106+ [ RequiresUnreferencedCode ( "Avro schema access requires reflection." ) ]
107+ private Schema ? GetAvroSchema (
108+ [ DynamicallyAccessedMembers ( DynamicallyAccessedMemberTypes . PublicFields ) ] Type payloadType )
109+ {
110+ var schemaField = payloadType . GetField ( "_SCHEMA" , BindingFlags . Public | BindingFlags . Static ) ;
111+ return schemaField ? . GetValue ( null ) as Schema ;
133112 }
134- }
113+ }
0 commit comments