in hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BasicDeserializer.java [273:515]
public Object readList(AbstractHessianInput in, int length)
throws IOException {
switch (_code) {
case BOOLEAN_ARRAY: {
if (length >= 0) {
boolean[] data = new boolean[length];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = in.readBoolean();
in.readEnd();
return data;
} else {
ArrayList list = new ArrayList();
while (!in.isEnd())
list.add(Boolean.valueOf(in.readBoolean()));
in.readEnd();
boolean[] data = new boolean[list.size()];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = ((Boolean) list.get(i)).booleanValue();
return data;
}
}
case SHORT_ARRAY: {
if (length >= 0) {
short[] data = new short[length];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = (short) in.readInt();
in.readEnd();
return data;
} else {
ArrayList list = new ArrayList();
while (!in.isEnd())
list.add(Short.valueOf((short) in.readInt()));
in.readEnd();
short[] data = new short[list.size()];
for (int i = 0; i < data.length; i++)
data[i] = ((Short) list.get(i)).shortValue();
in.addRef(data);
return data;
}
}
case INTEGER_ARRAY: {
if (length >= 0) {
int[] data = new int[length];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = in.readInt();
in.readEnd();
return data;
} else {
ArrayList list = new ArrayList();
while (!in.isEnd())
list.add(Integer.valueOf(in.readInt()));
in.readEnd();
int[] data = new int[list.size()];
for (int i = 0; i < data.length; i++)
data[i] = ((Integer) list.get(i)).intValue();
in.addRef(data);
return data;
}
}
case LONG_ARRAY: {
if (length >= 0) {
long[] data = new long[length];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = in.readLong();
in.readEnd();
return data;
} else {
ArrayList list = new ArrayList();
while (!in.isEnd())
list.add(Long.valueOf(in.readLong()));
in.readEnd();
long[] data = new long[list.size()];
for (int i = 0; i < data.length; i++)
data[i] = ((Long) list.get(i)).longValue();
in.addRef(data);
return data;
}
}
case FLOAT_ARRAY: {
if (length >= 0) {
float[] data = new float[length];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = (float) in.readDouble();
in.readEnd();
return data;
} else {
ArrayList list = new ArrayList();
while (!in.isEnd())
list.add(new Float(in.readDouble()));
in.readEnd();
float[] data = new float[list.size()];
for (int i = 0; i < data.length; i++)
data[i] = ((Float) list.get(i)).floatValue();
in.addRef(data);
return data;
}
}
case DOUBLE_ARRAY: {
if (length >= 0) {
double[] data = new double[length];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = in.readDouble();
in.readEnd();
return data;
} else {
ArrayList list = new ArrayList();
while (!in.isEnd())
list.add(new Double(in.readDouble()));
in.readEnd();
double[] data = new double[list.size()];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = ((Double) list.get(i)).doubleValue();
return data;
}
}
case STRING_ARRAY: {
if (length >= 0) {
String[] data = new String[length];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = in.readString();
in.readEnd();
return data;
} else {
ArrayList list = new ArrayList();
while (!in.isEnd())
list.add(in.readString());
in.readEnd();
String[] data = new String[list.size()];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = (String) list.get(i);
return data;
}
}
case OBJECT_ARRAY: {
if (length >= 0) {
Object[] data = new Object[length];
in.addRef(data);
for (int i = 0; i < data.length; i++)
data[i] = in.readObject();
in.readEnd();
return data;
} else {
ArrayList list = new ArrayList();
in.addRef(list); // XXX: potential issues here
while (!in.isEnd())
list.add(in.readObject());
in.readEnd();
Object[] data = new Object[list.size()];
for (int i = 0; i < data.length; i++)
data[i] = (Object) list.get(i);
return data;
}
}
default:
throw new UnsupportedOperationException(String.valueOf(this));
}
}