avro-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sean Busbey (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (AVRO-997) Union of enum and null cannot be serialized
Date Thu, 11 Oct 2012 22:05:03 GMT

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

Sean Busbey commented on AVRO-997:

Scott, I could write a patch that maintains the current behavior for unions of "things that
look like enum members when toString is called" and enums, which is to say the non-enum type
gets picked if it is present. eg ["string", "long", {"type":"enum", "symbols":["ONE", "TWO",
"42"]}] says that "ONE" is a string and 42 is a long. Since it would be consistent with current
behavior, a warning in the API about the coercion might be sufficient. It would be less efficient
than picking the enum member, but doing that would be just as breaking as reworking the generic
api to be strict.

The only time I've seen this come up is when someone has a union field and then wants to mark
it as optional so they move it to a union with null. While their original use of Java String
for field values was incorrect, the generic api as is would have worked fine up until the
addition of the union. In general I'm a fan of "just works" behavior from APIs, but I can
understand Doug's desire to favor consistent strict application as a way of steering users
away from behavior that will lead to confusing non-roundtrip-able edge cases.
> Union of enum and null cannot be serialized
> -------------------------------------------
>                 Key: AVRO-997
>                 URL: https://issues.apache.org/jira/browse/AVRO-997
>             Project: Avro
>          Issue Type: Bug
>    Affects Versions: 1.5.1
>            Reporter: Aaron Kimball
>            Assignee: Sean Busbey
>             Fix For: 1.8.0
>         Attachments: AVRO-997.patch, AVRO-997.patch
> I have a schema like:
> {code}
> [
> {
>   "type": "enum",
>   "name": "Gender",
>   "symbols": ["M", "F"]
> },
> {
>   "type" : "record",
>   "name" : "Foo",
>   "fields" : [
>     { "type" : ["Gender", "null"], "name" : "gender" },
>     ...
>   ]
> }
> ]
> {code}
> I build a record like {{Foo foo = new Foo(); foo.gender = Gender.M;}}
> When I go to serialize this, I get:
> {code}Not in union [{"type":"enum","name":"Gender","symbols":["M","F"]},"null"]: M
> 	at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:482)
> 	at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:70)
> 	at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:104)
> 	at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
> 	at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:57)
> {code}

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

View raw message