[ 
https://issues.apache.org/jira/browse/HADOOP-9240?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

David Parks updated HADOOP-9240:
--------------------------------

    Affects Version/s: 1.0.3
    
> Making ArrayWritable typed
> --------------------------
>
>                 Key: HADOOP-9240
>                 URL: https://issues.apache.org/jira/browse/HADOOP-9240
>             Project: Hadoop Common
>          Issue Type: Improvement
>          Components: io
>    Affects Versions: 1.0.3
>            Reporter: David Parks
>            Priority: Minor
>
> ArrayWritable is just painful to use in practice, it would be nice if we had 
> a typed version of ArrayWritable that had all the features of an ArrayList.
> It wasn't hard to write, and it doesn't cost more in terms of storage or CPU 
> than an ArrayWritable. 
> So I wonder why not include a more usable ArrayListWritable class with 
> Hadoop? Code pasted below, unless there's a reason that this is a bad idea 
> I'm happy to provide the unit test for it as well.
> @SuppressWarnings("serial")
> public class ArrayListWritable<E extends Writable> extends ArrayList<E> 
> implements Writable {
>       Class<E> type = null;
>       
>       public ArrayListWritable(Class<E> type){
>               super();
>               this.type = type;
>       }
>       
>       public ArrayListWritable(){
>               super();
>       }
>       
>       public void setArrayClassType(Class<E> clazz){
>               this.type = clazz;
>       }
>       
>       @Override
>       public void write(DataOutput out) throws IOException {
>               if(type==null){ throw new IOException("Cannot write an " + 
> getClass().getName() + " without the class type being set in the constructor 
> or with setArrayClassType(...)"); };
>               out.writeUTF(type.getCanonicalName());
>               out.writeInt(size());
>               for(E writable : this) writable.write(out);
>       }
>       
>       @SuppressWarnings("unchecked")
>       @Override
>       public void readFields(DataInput in) throws IOException {
>               clear();
>               
>               //Read the class name
>               try {
>                       type = (Class<E>)Class.forName(in.readUTF());
>               } catch (ClassNotFoundException e) {
>                       throw new IOException("Invalid connonical name read 
> from input bytes", e);
>               }
>               //Read the size & set capacity of the arraylist
>               int size = in.readInt();
>               ensureCapacity(size);
>               
>               //Read in individual writables
>               for (int i = 0; i < size; i++) {
>                       Writable value = WritableFactories.newInstance(type);
>                       value.readFields(in);                       // read a 
> value
>                       add((E)value);                                          
>                 // add it to the ArrayList
>               }
>       }
> }

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