Lucas Javaudin created AVRO-3646:
------------------------------------

             Summary: Serialization / deserialization for enum with mixed 
variants (with and without data)
                 Key: AVRO-3646
                 URL: https://issues.apache.org/jira/browse/AVRO-3646
             Project: Apache Avro
          Issue Type: Bug
          Components: rust
            Reporter: Lucas Javaudin


Consider the following example of what I call an "enum with mixed variants":
{code:java}
enum MixedExternalEnum {
    Val1,
    Val2(f32),
} {code}
For the two variants, this enum can be properly serialized to and deserialized 
from a {{types::Value}}  (using {{ser::to_value}} and {{{}de::from_value{}}}). 
The problem is that the way they are represented as a \{{types::Value }}cannot 
be represented using an Avro Schema.

The serialized version of {{MixedExternalEnum::Val1}} is
{code:java}
Value::Record(vec![("a".to_owned(), Value::Enum(0, "Val1".to_owned()))])
{code}
while the serialized version of {{MixedExternalEnum::Val2(0.0)}} is
{code:java}
Value::Record(vec![(
    "a".to_owned(),
    Value::Record(vec![
        ("type".to_owned(), Value::Enum(1, "Val2".to_owned())),
        (
            "value".to_owned(),
            Value::Union(1, Box::new(Value::Float(0.0))),
        ),
    ]),
)])
{code}
As far as I know, there is no Avro Schema compatible with both possible values.

One solution I can think of is to change the serialization of 
{{MixedExternalEnum::Val1}} to
{code:java}
Value::Record(vec![(
    "a".to_owned(),
    Value::Record(vec![
        ("type".to_owned(), Value::Enum(0, "Val1".to_owned())),
        (
            "value".to_owned(),
            Value::Union(0, Box::new(Value::Null)),
        ),
    ]),
)])
{code}
 

A workaround is to replace {{Val1}} by {{Val1(())}} in the enum definition (see 
AVRO-3645) but this can have undesirable effects for other parts of the code.

 

Then, it's another story for adjacently tagged, internally tagged and untagged 
enum...



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

Reply via email to