docs: @SuppressWarnings("unchecked")
      public MBeanInfoWrapper readMBeanInfo(InputStream in) throws ConversionException, IOException, ClassNotFoundException {
          JSONObject json = parseObject(in);
          MBeanInfoWrapper ret = new MBeanInfoWrapper();
          if (USE_BASE64_FOR_MBEANINFO) {
              Object o = readSerialized(json.get(N_SERIALIZED));
              if (!(o instanceof MBeanInfo)) {
                  throwConversionException("readMBeanInfo() receives an instance that's not a MBeanInfo.", json.get(N_SERIALIZED));
              }
              ret.mbeanInfo = (MBeanInfo) o;
              ret.attributesURL = readStringInternal(json.get(N_ATTRIBUTES_URL));
              o = readSerialized(json.get(OM_ATTRIBUTES));
              if (!(o instanceof HashMap)) {
                  throwConversionException("readMBeanInfo() receives an instance that's not a HashMap.", json.get(OM_ATTRIBUTES));
              }
              ret.attributeURLs = (Map<String, String>) o;
              o = readSerialized(json.get(OM_OPERATIONS));
              if (!(o instanceof HashMap)) {
                  throwConversionException("readMBeanInfo() receives an instance that's not a HashMap.", json.get(OM_OPERATIONS));
              }
              ret.operationURLs = (Map<String, String>) o;
              return ret;
          }
          ret.attributeURLs = new HashMap<String, String>();
          ret.operationURLs = new HashMap<String, String>();
          String className = readStringInternal(json.get(N_CLASSNAME));
          String description = readStringInternal(json.get(N_DESCRIPTION));
          Descriptor descriptor = readDescriptor(json.get(N_DESCRIPTOR));
          MBeanAttributeInfo[] attributes = readAttributes(json.get(N_ATTRIBUTES), ret.attributeURLs);
          String attributeURL = readStringInternal(json.get(N_ATTRIBUTES_URL));
          MBeanConstructorInfo[] constructors = readConstructors(json.get(N_CONSTRUCTORS));
          MBeanNotificationInfo[] notifications = readNotifications(json.get(N_NOTIFICATIONS));
          MBeanOperationInfo[] operations = readOperations(json.get(N_OPERATIONS), ret.operationURLs);
          ret.attributesURL = attributeURL;
          Object o = json.get(N_SERIALIZED);
          if (o != null) {
              o = readSerialized(o);
              if (!(o instanceof MBeanInfo)) {
                  throwConversionException("readMBeanInfo() receives an instance that's not a MBeanInfo.", json.get(N_SERIALIZED));
              }
              ret.mbeanInfo = (MBeanInfo) o;
          } else {
              ret.mbeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, notifications, descriptor);
          }
          return ret;
      }