2011-11-03 16 views
13

Sto cercando di implementare la classe Writable, ma non ho idea di come implementare una classe scrivibile se nella mia classe ci sono oggetti nidificati, come lista, ecc. Qualcuno potrebbe aiutarmi? grazieCome personalizzare la classe scrivibile in Hadoop?

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

} 

seguito è la classe del campo:

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

Provare a semplificare il codice al minimo e riscrivere la tua domanda, è resistente comprensibile .. – JMelnik

risposta

17

serializzazione collezioni è abbastanza semplice.

@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); 
    } 
} 

campo deve implementare Writable pure.

Problemi correlati