in java/fury-core/src/main/java/org/apache/fury/serializer/ObjectStreamSerializer.java [167:242]
public Object read(MemoryBuffer buffer) {
Object obj = null;
if (constructor != null) {
try {
obj = constructor.newInstance();
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
Platform.throwException(e);
}
} else {
obj = Platform.newInstance(type);
}
fury.getRefResolver().reference(obj);
int numClasses = buffer.readInt16();
int slotIndex = 0;
try {
TreeMap<Integer, ObjectInputValidation> callbacks = new TreeMap<>(Collections.reverseOrder());
for (int i = 0; i < numClasses; i++) {
Class<?> currentClass = classResolver.readClassInternal(buffer);
SlotsInfo slotsInfo = slotsInfos[slotIndex++];
StreamClassInfo streamClassInfo = slotsInfo.streamClassInfo;
while (currentClass != slotsInfo.cls) {
// the receiver's version extends classes that are not extended by the sender's version.
Method readObjectNoData = streamClassInfo.readObjectNoData;
if (readObjectNoData != null) {
if (streamClassInfo.readObjectNoDataFunc != null) {
streamClassInfo.readObjectNoDataFunc.accept(obj);
} else {
readObjectNoData.invoke(obj);
}
}
slotsInfo = slotsInfos[slotIndex++];
}
Method readObjectMethod = streamClassInfo.readObjectMethod;
if (readObjectMethod == null) {
slotsInfo.slotsSerializer.readAndSetFields(buffer, obj);
} else {
FuryObjectInputStream objectInputStream = slotsInfo.objectInputStream;
MemoryBuffer oldBuffer = objectInputStream.buffer;
Object oldObject = objectInputStream.targetObject;
FuryObjectInputStream.GetFieldImpl oldGetField = objectInputStream.getField;
FuryObjectInputStream.GetFieldImpl getField =
(FuryObjectInputStream.GetFieldImpl) slotsInfo.getFieldPool.popOrNull();
if (getField == null) {
getField = new FuryObjectInputStream.GetFieldImpl(slotsInfo);
}
boolean fieldsRead = objectInputStream.fieldsRead;
try {
objectInputStream.fieldsRead = false;
objectInputStream.buffer = buffer;
objectInputStream.targetObject = obj;
objectInputStream.getField = getField;
objectInputStream.callbacks = callbacks;
if (streamClassInfo.readObjectFunc != null) {
streamClassInfo.readObjectFunc.accept(obj, objectInputStream);
} else {
readObjectMethod.invoke(obj, objectInputStream);
}
} finally {
objectInputStream.fieldsRead = fieldsRead;
objectInputStream.buffer = oldBuffer;
objectInputStream.targetObject = oldObject;
objectInputStream.getField = oldGetField;
slotsInfo.getFieldPool.add(getField);
objectInputStream.callbacks = null;
Arrays.fill(getField.vals, FuryObjectInputStream.NO_VALUE_STUB);
}
}
}
for (ObjectInputValidation validation : callbacks.values()) {
validation.validateObject();
}
} catch (InvocationTargetException | IllegalAccessException | InvalidObjectException e) {
throwSerializationException(type, e);
}
return obj;
}