in core/src/main/java/flex/messaging/io/amf/Amf3Output.java [417:514]
protected void writeListAsTypedVector(List list) throws IOException {
// Peek at the first three elements of the list to figure out what type
// of Vector it should be sent as.
int vecType = -1;
Class<?> initialElementClass = null;
int peekSize = Math.min(list.size(), 3);
for (int i = 0; i < peekSize; i++) {
Object element = list.get(i);
if (i == 0) {
initialElementClass = element != null ? element.getClass() : null;
} else {
Class<?> currentElementClass = element != null ? element.getClass() : null;
if (initialElementClass != currentElementClass) {
vecType = kTypedVectorObject;
break;
}
}
}
if (vecType == -1) {
if (initialElementClass == Integer.class)
vecType = kTypedVectorInt;
else if (initialElementClass == Double.class)
vecType = kTypedVectorDouble;
else
vecType = kTypedVectorObject;
}
out.write(vecType);
if (byReference(list))
return;
int length = list.size();
writeUInt29((length << 1) | 1);
writeBoolean(false /*fixed*/);
switch (vecType) {
case kTypedVectorInt:
if (isDebug)
trace.startAMFVector(objectTable.size() - 1, VectorType.INT);
for (int i = 0; i < length; i++) {
if (isDebug)
trace.arrayElement(i);
Object element = list.get(i);
int value = ((Integer) element).intValue();
if (isDebug)
trace.write(value);
writeInt(value);
}
break;
case kTypedVectorDouble:
if (isDebug)
trace.startAMFVector(objectTable.size() - 1, VectorType.DOUBLE);
for (int i = 0; i < length; i++) {
if (isDebug)
trace.arrayElement(i);
Object element = list.get(i);
double value = ((Double) element).doubleValue();
if (isDebug)
trace.write(value);
writeDouble(value);
}
break;
case kTypedVectorObject:
if (isDebug)
trace.startAMFVector(objectTable.size() - 1, VectorType.OBJECT);
// TODO - I don't think this className is used properly on the client currently.
String className = initialElementClass != null ? initialElementClass.getName() : "";
writeStringWithoutType(className);
for (int i = 0; i < length; i++) {
if (isDebug)
trace.arrayElement(i);
Object element = list.get(i);
increaseNestObjectLevel();
writeObject(element);
decreaseNestObjectLevel();
}
break;
default:
break;
}
if (isDebug)
trace.endAMFVector();
}