You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Allan Wax (JIRA)" <ji...@apache.org> on 2018/06/21 18:15:00 UTC
[jira] [Updated] (AVRO-2190) ReflectData...getSchema() produces bad
output for abstract java classes
[ 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)