2011-11-03 27 views
13

Tôi đang cố gắng thực hiện lớp có thể ghi, nhưng tôi không có ý tưởng về cách thực hiện một lớp có thể ghi được nếu trong lớp của tôi có đối tượng lồng nhau, chẳng hạn như danh sách, v.v. nhờCách tùy chỉnh lớp có thể ghi trong 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; 
} 

} 

Tiếp theo là lớp Dòng:

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

Cố gắng đơn giản hóa code để tối thiểu và viết lại câu hỏi của bạn, đó là hardy hiểu .. – JMelnik

Trả lời

17

Serializing bộ sưu tập khá đơn giản.

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

Trường cũng phải triển khai Writable.

Các vấn đề liên quan