}
ObjectInputStream.GetField getField(final SerialUnmarshaller serialUnmarshaller, final SerializableClass sc) throws IOException, ClassNotFoundException {
final Map<String, ReadField> readFields = new HashMap<String, ReadField>();
for (SerializableField serializableField : sc.getFields()) {
final ReadField readField;
switch (serializableField.getKind()) {
case BOOLEAN: {
readField = new BooleanReadField(serializableField);
break;
}
case BYTE: {
readField = new ByteReadField(serializableField);
break;
}
case CHAR: {
readField = new CharReadField(serializableField);
break;
}
case DOUBLE: {
readField = new DoubleReadField(serializableField);
break;
}
case FLOAT: {
readField = new FloatReadField(serializableField);
break;
}
case INT: {
readField = new IntReadField(serializableField);
break;
}
case LONG: {
readField = new LongReadField(serializableField);
break;
}
case OBJECT: {
readField = new ObjectReadField(serializableField);
break;
}
case SHORT: {
readField = new ShortReadField(serializableField);
break;
}
default: {
continue;
}
}
readFields.put(serializableField.getName(), readField);
}
// read primitive fields
for (SerializableField serializableField : fields) {
final ReadField readField;
switch (serializableField.getKind()) {
case BOOLEAN: {
readField = new BooleanReadField(serializableField, serialUnmarshaller.readBoolean());
break;
}
case BYTE: {
readField = new ByteReadField(serializableField, serialUnmarshaller.readByte());
break;
}
case CHAR: {
readField = new CharReadField(serializableField, serialUnmarshaller.readChar());
break;
}
case DOUBLE: {
readField = new DoubleReadField(serializableField, serialUnmarshaller.readDouble());
break;
}
case FLOAT: {
readField = new FloatReadField(serializableField, serialUnmarshaller.readFloat());
break;
}
case INT: {
readField = new IntReadField(serializableField, serialUnmarshaller.readInt());
break;
}
case LONG: {
readField = new LongReadField(serializableField, serialUnmarshaller.readLong());
break;
}
case SHORT: {
readField = new ShortReadField(serializableField, serialUnmarshaller.readShort());
break;
}
default: {
continue;
}
}
readFields.put(serializableField.getName(), readField);
}
// read object fields
for (SerializableField serializableField : fields) {
final ReadField readField;
switch (serializableField.getKind()) {
case OBJECT: {
readField = new ObjectReadField(serializableField, serialUnmarshaller.readObject());
break;
}
default: {
continue;
}
}
readFields.put(serializableField.getName(), readField);
}
return new ObjectInputStream.GetField() {
public ObjectStreamClass getObjectStreamClass() {
throw new UnsupportedOperationException("getObjectStreamClass()");
}
public boolean defaulted(final String name) throws IOException {
final ReadField field = readFields.get(name);
return field == null || field.isDefaulted();
}
public boolean get(final String name, final boolean val) throws IOException {
final ReadField field = readFields.get(name);
return field == null || field.isDefaulted() ? val : field.getBoolean();
}
public byte get(final String name, final byte val) throws IOException {
final ReadField field = readFields.get(name);
return field == null || field.isDefaulted() ? val : field.getByte();
}
public char get(final String name, final char val) throws IOException {
final ReadField field = readFields.get(name);
return field == null || field.isDefaulted() ? val : field.getChar();
}
public short get(final String name, final short val) throws IOException {
final ReadField field = readFields.get(name);
return field == null || field.isDefaulted() ? val : field.getShort();
}
public int get(final String name, final int val) throws IOException {
final ReadField field = readFields.get(name);
return field == null || field.isDefaulted() ? val : field.getInt();
}
public long get(final String name, final long val) throws IOException {
final ReadField field = readFields.get(name);
return field == null || field.isDefaulted() ? val : field.getLong();
}
public float get(final String name, final float val) throws IOException {
final ReadField field = readFields.get(name);
return field == null || field.isDefaulted() ? val : field.getFloat();
}
public double get(final String name, final double val) throws IOException {
final ReadField field = readFields.get(name);
return field == null || field.isDefaulted() ? val : field.getDouble();
}
public Object get(final String name, final Object val) throws IOException {
final ReadField field = readFields.get(name);
return field == null || field.isDefaulted() ? val : field.getObject();
}
};
}