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

Christophe Le Saec commented on AVRO-2190:
------------------------------------------

Could this be compbined with the idea of Polymorphism ? 
[AVRO-2918|https://issues.apache.org/jira/browse/AVRO-2918]
Here, ReflectData.getSchema would visit java object hierarchy (excluding 
java.lang.Object) to build schema.

{code:java}
ReflectData.AllowNull refect = ReflectData.AllowNull.get();
Schema schemaInet4 = refect.getSchema(Inet4Address.class); // would extract 
hierarchy or record Inet4Address extends InetAddress.
Schema schemaInet6 = refect.getSchema(Inet6Address.class); // would complete 
hierarchy with known schema for InetAddress

Schema schema = refect.getSchema(clazz); // as class contains InetAddress 
attribute.
{code}
it would mean that ReflectData instance should retains schemas of parsed 
classes, and schema parent should keep trace of its known children.


> ReflectData...getSchema() produces bad output for abstract java classes
> -----------------------------------------------------------------------
>
>                 Key: AVRO-2190
>                 URL: https://issues.apache.org/jira/browse/AVRO-2190
>             Project: Apache 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
(v8.20.10#820010)

Reply via email to