public Object read()

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