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

Doug Cutting commented on AVRO-1341:
------------------------------------

Java's "transient" modifier is already equivalent to AvroIgnore.  We might 
additionally observe Java's Transient annotation.  With those, do we also need 
AvroIgnore?  Perhaps.

With AvroEncoder I'm concerned that folks can easily write data that doesn't 
conform to its declared schema, resulting in data that cannot be read.  We 
should add warnings to the documentation, starting it with "Expert:" and 
mentioning that use of ValidatingEncoder is recommended.  (For example, 
DataFileWriter#appendEncoded is labeled "Expert" since it also bypasses type 
safety.)

So, with some updated javadoc, I'd be happy to commit this.  Anyone object?
                
> Allow controlling avro via java annotations when using reflection. 
> -------------------------------------------------------------------
>
>                 Key: AVRO-1341
>                 URL: https://issues.apache.org/jira/browse/AVRO-1341
>             Project: Avro
>          Issue Type: New Feature
>          Components: java
>            Reporter: Vincenz Priesnitz
>            Assignee: Vincenz Priesnitz
>         Attachments: AVRO-1341.patch, AVRO-1341.patch
>
>
> It would be great if one could control avro with java annotations. As of now, 
> it is already possible to mark fields as Nullable or classes being encoded as 
> a String. I propose a bigger set of annotations to control the behavior of 
> avro on fields and classes. Such annotations have proven useful with jacksons 
> json serialization and morphias mongoDB serialization.
> I propose the following additional annotations: 
> @AvroName("alternativeName")
> @AvroIgnore
> @AvroMeta(key="K", value="V")
> @AvroEncode(using=CustomEncoding.class)
> Java fields with the @AvroName("alternativeName") annotation will be renamed 
> in the induced schema. When reading an avro file via reflection, the 
> reflection reader will look for fields in the schema with "alternativeName". 
> For example:
> {code}
>    @AvroName("foo")
>    int bar;  
> {code}
> is serialized as
> {code}
>   { "name" : "foo", "type" : "int" } 
> {code}
> Fields with the @AvroIgnore annotation will be treated as if they had a 
> transient modifier, i.e. they will not be written to or read from avro files. 
> The @AvroMeta(key="K", value="V") annotation allows you to store an arbitrary 
> key : value pair at every node in the schema.
> {code}
>    @AvroMeta(key="fieldKey", value="fieldValue")
>    int foo;  
> {code}
> will create the following schema
> {code}
> {"name" : "foo", "type" : "int", "fieldKey" : "fieldValue" } 
> {code}
> Fields can be custom encoded with the AvroEncode(using=CustomEncoding.class) 
> annotation. This annotation is a generalization of the @Stringable 
> annotation. The @Stringable annotation is limited to classes with string 
> argument constructors. Some classes can be similarly reduced to a smaller 
> class or even a single primitive, but dont fit the requirements for 
> @Stringable. A prominent example is java.util.Date, which instances can 
> essentially be described with a single long. Such classes can now be encoded 
> with a CustomEncoding, which reads and writes directly from the 
> encoder/decoder. 
> One simply extends the abstract CustomEncodings class by implementing a 
> schema, a read method and a write method. A java field can then be annotated 
> like this:
> {code}
> @AvroEncode(using=DateAslongEncoding.class)
> Date date;
> {code}
> The custom encoding implementation would look like 
> {code}
> public class DateAsLongEncoding extends CustomEncoding<Date> {
>   {
>     schema = Schema.create(Schema.Type.LONG);
>     schema.addProp("CustomEncoding", "DateAsLongEncoding");
>   }
>   
>   @Override
>   public void write(Object datum, Encoder out) throws IOException {
>     out.writeLong(((Date)datum).getTime());
>   }
>   
>   @Override
>   public Date read(Object reuse, Decoder in) throws IOException {
>     if (reuse != null) {
>       ((Date)reuse).setTime(in.readLong());
>       return (Date)reuse;
>     }
>     else return new Date(in.readLong());
>   }
> }
> {code}
> I implemented said annotations and a custom encoding for java.util.Date as a 
> proof of concept and also extended the @Stringable annotations to fields.
> This issue is a followup of AVRO-1328 and AVRO-1330.

--
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

Reply via email to