2011-11-03 27 views
13

我想實現Writable類,但我不知道如何實現一個可寫類,如果在我的類中有嵌套對象,如列表等。可以任何身體幫助我嗎?感謝如何在Hadoop中定製Writable類?

public class StorageClass implements Writable{ 

public String xStr; 
public String yStr; 

public List<Field> sStor 

//omitted ctors 


@override 
public void write(DataOutput out) throws IOException{ 
    out.writeChars(xStr); 
    out.WriteChars(yStr); 

    //WHAT SHOULD I DO FOR List<Field> 

} 

@override 
public void readFields(DataInput in) throws IOException{ 
    xStr = in.readLine(); 
    yStr = in.readLine(); 

    //WHAT SHOULD I DO FOR List<Field> 
} 

} 

public class SubStorage{ 
    public String x; 
    public String y; 
} 

} 

以下是Field類:

public final class Field implements Comparable<Field>, Serializable { 

    private String name; 
    private DataType dataType; 
    private Object value; 
    private FieldType fieldType; 


    public Field(){ 

    } 



    public Field(String name, DataType dataType, FieldType fieldType){ 
     this(name, dataType, null, fieldType); 
    } 

    public Field(String name, DataType type, Object value, FieldType fieldType){ 
     this.name = name; 
     this.dataType = type; 
     this.value = value; 
     this.fieldType = fieldType; 
    } 
} 





public enum FieldType { 
    PRI, LOOKUP, SCD, VERSION, OTHER 
} 



public enum DataType { 

    UNDEFINED(4) { 
     public int getSizeInBytes(Object value) { 
      return STRING.getSizeInBytes(value); 
     } 
    }, 

    STRING(4) { 
     public int getSizeInBytes(Object value) { 
      if (value == null) { 
       return 0; 
      } 
      return super.getSizeInBytes(value) + (value.toString().length() * 2); // length + chars 
     } 
    }, 

    INT(4), 
    LONG(8), 
    DOUBLE(8), 
    DATETIME(8), 
    BOOLEAN(1), 
    BYTE(1), 
    FLOAT(4), 
    SHORT(2), 
    CHAR(2), 
    DATE(8), 
    TIME(8), 

    BLOB(0) { 
     public int getSizeInBytes(Object value) { 
      if (value == null) { 
       return 0; 
      } 
      return ((byte[])value).length; 
     } 
    }; 

    private final int sizeInBytes; 

    private DataType(int sizeInBytes) { 
     this.sizeInBytes = sizeInBytes; 
    } 

    public int getSizeInBytes(Object value) { 
     return sizeInBytes; 
    } 

} 
+0

儘量簡化代碼,最小和重寫你的問題,這是可以理解的耐寒.. – JMelnik

回答

17

序列化的集合是相當簡單的。

@Override 
public void readFields(DataInput in) throws IOException { 
    int size = in.readInt(); 
    list= new ArrayList<Field>(size); 
    for(int i = 0; i < size; i++){ 
     Field f = new Field(); 
     f.readFields(in); 
     list.add(f); 
    } 
} 

@Override 
public void write(DataOutput out) throws IOException { 
    out.writeInt(list.size()); 
    for (Field l : list) { 
     l.write(out); 
    } 
} 

現場必須實施Writable以及。

相關問題