You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-dev@hadoop.apache.org by "David Parks (JIRA)" <ji...@apache.org> on 2013/01/24 10:33:12 UTC
[jira] [Created] (HADOOP-9240) Making ArrayWritable typed
David Parks created HADOOP-9240:
-----------------------------------
Summary: Making ArrayWritable typed
Key: HADOOP-9240
URL: https://issues.apache.org/jira/browse/HADOOP-9240
Project: Hadoop Common
Issue Type: Improvement
Components: io
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