[
https://issues.apache.org/jira/browse/AVRO-3646?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Lucas Javaudin updated AVRO-3646:
---------------------------------
Description:
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...
was:
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...
> 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
> Priority: Major
> Labels: rust
>
> 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)