docs: private Serializable getObjectInternal() throws Exception {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(this, tc, "getObjectInternal");
  
          Serializable obj = null;
          ObjectInputStream ois = null;
  
          // SIB0121 - check to see if the consumer has promised not to modify the payload
          // If so, call method to get the REAL object from the underlying message object
          if (consumerWontModifyPayloadAfterGet) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  SibTr.debug(this, tc, "Get REAL object from underlying message object");
              obj = objMsg.getRealObject();
          }
  
          else {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  SibTr.debug(this, tc, "Get object from underlying message and deserialize");
  
              // Retrieve from the MFP component.
              byte[] byteForm = objMsg.getSerializedObject();
              if (byteForm != null) {
                  try {
  
                      ByteArrayInputStream bais = new ByteArrayInputStream(byteForm);
  
                      ClassLoader cl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
                      {
                          @Override
                          public ClassLoader run() {
                              return Thread.currentThread().getContextClassLoader();
                          }
                      });
                      ois = new DeserializationObjectInputStream(bais, cl);
                      obj = (Serializable) ois.readObject();
                  } catch (Exception e) {
                      // No FFDC code needed
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                          SibTr.debug(this, tc, "Exception deserializing object - throw on to caller");
                      // Note that we have made a deliberate choice here not to call FFDC or trace
                      // in order to prevent stack overflow as described by the method comment.
                      throw e;
                  } finally {
                      try {
                          if (ois != null) {
                              ois.close();
                          }
                      } catch (IOException ex) {
                          // No FFDC code needed
                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                              SibTr.debug(this, tc, "Exception closing the ObjectInputStream", ex);
                      }
                  }
              }
          }
  
          // The caller will trace the class of the return value
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(this, tc, "getObjectInternal");
          return obj;
      }