You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@avro.apache.org by "Andrei Leib (Jira)" <ji...@apache.org> on 2023/09/06 23:51:00 UTC

[jira] [Commented] (AVRO-3848) MessageDeserializer uses wrong type for map fields

    [ https://issues.apache.org/jira/browse/AVRO-3848?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17762519#comment-17762519 ] 

Andrei Leib commented on AVRO-3848:
-----------------------------------

The Avro compiler supports `stringType` property by inserting Java-specific annotation `"avro.java.string": "String"` for all string types

In effect this makes the reader schema different from the writer schema. Passing the schema without the `avro.java.string` to the decoder is asking Avro to use default type for string which is `Utf8`

I modified you example as follows and it passed:
{code:java}
    private RecordWithMapField deserialize(byte[] serialized) {
        MessageDecoder<RecordWithMapField> decoder;
        try {
            Schema schema = RecordWithMapField.getClassSchema();
            decoder = new BinaryMessageDecoder<>(SpecificData.getForClass(RecordWithMapField.class), schema);
            return decoder.decode(serialized);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    } {code}
The reader schema is now coming from the compiled class.

> MessageDeserializer uses wrong type for map fields
> --------------------------------------------------
>
>                 Key: AVRO-3848
>                 URL: https://issues.apache.org/jira/browse/AVRO-3848
>             Project: Apache Avro
>          Issue Type: Bug
>            Reporter: Eduard Schleining
>            Priority: Major
>
> When using the avro-maven-plugin to generate classes with map fields, the MessageDecoder will disregard the "stringType" setting and always provide a map with entries of type UTF8 instead of String.
> You can see the behavior in the unit test here:
> [https://github.com/eschleining/avroMapDeserialization]
> Expected Behavior:
> The org.apache.avro.message.MessageDecoder should use keys and values of type String for classes with fields of type Map<String,String>.
> Actual Behavior:
> The org.apache.avro.message.MessageDecoder puts Map<Utf8,Utf8> into fields that are generated as Map<String,String>



--
This message was sent by Atlassian Jira
(v8.20.10#820010)