[ https://issues.apache.org/jira/browse/AVRO-2190?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Allan Wax updated AVRO-2190: ---------------------------- Description: ReflectData produces 'invalid' type entries for Abstract objects. An example is InetAddress. What it produces is valid JSON but the schema cannot be used to deserialize/read the serialized/write output. ReflectData produces is {"type":"record","name":"InetAddress","namespace":"java.net","fields":[]} but it should notice that InetAddress is an _abstract_ class and go find the classes that extend the class. {"type":"record","name":"Inet4Address","namespace":"java.net","fields":[]},\{"type":"record","name":"Inet6Address","namespace":"java.net","fields":[]} I have a current workaround for this with the following, but it is a little hacky and not that efficient if used alot. {color:#000080}private static {color}String {color:#660e7a}abstractInetAddress {color}= {color:#008000}"{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}InetAddress{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}"{color}; {color:#000080}private static {color}String {color:#660e7a}abstractInetAddressReplacement {color}= {color:#008000}// "{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}Inet4Address{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}" {color}+ {color:#808080}//{color} {color:#008000}",{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}Inet6Address{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}"{color}; {color:#000080}public {color}AvroUtil(Class<{color:#20999d}T{color}> clazz) { {color:#660e7a}schema {color}= ReflectData.AllowNull.get().getSchema(clazz); String s = {color:#660e7a}schema{color}.toString().replace({color:#660e7a}abstractInetAddress{color}, {color:#660e7a}abstractInetAddressReplacement{color}); {color:#660e7a}schema {color}= {color:#000080}new {color}Schema.Parser().parse(s); {color:#000080}this{color}.{color:#660e7a}clazz {color}= clazz; } was: ReflectData produces 'invalid' type entries for Abstract objects. An example is InetAddress. What it produces is valid JSON but the schema cannot be used to deserialize/read the serialized/write output. ReflectData produces is {{{"type":"record","name":"InetAddress","namespace":"java.net","fields":[]}}} but it should notice that InetAddress is an _abstract_ class and go find the classes that extend the class. {{{"type":"record","name":"Inet4Address","namespace":"java.net","fields":[]},\{"type":"record","name":"Inet6Address","namespace":"java.net","fields":[]}}} I have a current workaround for this with the following, but it is a little hacky and not that efficient if used alot. {color:#000080}private static {color}String {color:#660e7a}abstractInetAddress {color}= {color:#008000}"{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}InetAddress{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}"{color}; {color:#000080}private static {color}String {color:#660e7a}abstractInetAddressReplacement {color}= {color:#808080}// {color} {color:#008000}"{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}Inet4Address{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}" {color}+ {color:#808080}// {color} {color:#008000}",{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}Inet6Address{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}"{color}; {color:#000080}public {color}AvroUtil(Class<{color:#20999d}T{color}> clazz) { {color:#660e7a}schema {color}= ReflectData.AllowNull.get().getSchema(clazz); String s = {color:#660e7a}schema{color}.toString().replace({color:#660e7a}abstractInetAddress{color}, {color:#660e7a}abstractInetAddressReplacement{color}); {color:#660e7a}schema {color}= {color:#000080}new {color}Schema.Parser().parse(s); {color:#000080}this{color}.{color:#660e7a}clazz {color}= clazz; } > ReflectData...getSchema() produces bad output for abstract java classes > ----------------------------------------------------------------------- > > Key: AVRO-2190 > URL: https://issues.apache.org/jira/browse/AVRO-2190 > Project: Avro > Issue Type: Bug > Components: java > Affects Versions: 1.8.2 > Environment: The working environment is Windows 10 with java 1.8 92 > but I suspect this code will work on all systems. > Reporter: Allan Wax > Priority: Major > > ReflectData produces 'invalid' type entries for Abstract objects. An example > is InetAddress. What it produces is valid JSON but the schema cannot be used > to deserialize/read the serialized/write output. ReflectData produces is > {"type":"record","name":"InetAddress","namespace":"java.net","fields":[]} > but it should notice that InetAddress is an _abstract_ class and go find the > classes that extend the class. > {"type":"record","name":"Inet4Address","namespace":"java.net","fields":[]},\{"type":"record","name":"Inet6Address","namespace":"java.net","fields":[]} > > I have a current workaround for this with the following, but it is a little > hacky and not that efficient if used alot. > {color:#000080}private static {color}String > {color:#660e7a}abstractInetAddress {color}= > {color:#008000}"{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}InetAddress{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}"{color}; > {color:#000080}private static {color}String > {color:#660e7a}abstractInetAddressReplacement {color}= {color:#008000}// > > "{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}Inet4Address{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}" > {color}+ {color:#808080}//{color} > > {color:#008000}",{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}Inet6Address{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}"{color}; > {color:#000080}public {color}AvroUtil(Class<{color:#20999d}T{color}> clazz) { > {color:#660e7a}schema {color}= > ReflectData.AllowNull.get().getSchema(clazz); > String s = > {color:#660e7a}schema{color}.toString().replace({color:#660e7a}abstractInetAddress{color}, > {color:#660e7a}abstractInetAddressReplacement{color}); > {color:#660e7a}schema {color}= {color:#000080}new > {color}Schema.Parser().parse(s); > {color:#000080}this{color}.{color:#660e7a}clazz {color}= clazz; > } > -- This message was sent by Atlassian JIRA (v7.6.3#76005)