public function writeValue(Clazz $clazz, $instance)
 {
     if ($clazz === Boolean::typeClass()) {
         $this->writeObject(new Boolean($instance));
     } else {
         if ($clazz === Byte::typeClass()) {
             $this->writeObject(new Byte($instance));
         } else {
             if ($clazz === Character::typeClass()) {
                 $this->writeObject(new Character($instance));
             } else {
                 if ($clazz === Double::typeClass()) {
                     $this->writeObject(new Double($instance));
                 } else {
                     if ($clazz === Float::typeClass()) {
                         $this->writeObject(new Float($instance));
                     } else {
                         if ($clazz === Integer::typeClass()) {
                             $this->writeObject(new Integer($instance));
                         } else {
                             if ($clazz === Long::typeClass()) {
                                 $this->writeObject(new Long($instance));
                             } else {
                                 if ($clazz === Short::typeClass()) {
                                     $this->writeObject(new Short($instance));
                                 } else {
                                     if ($clazz === String::clazz()) {
                                         $this->writeString($instance);
                                     } else {
                                         if ($clazz->isEnum()) {
                                             $this->writeEnum($clazz, $instance);
                                         } else {
                                             $this->writeObject($instance);
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }
 private function instantiate(Clazz $customSerializer = null, Clazz $instanceClass)
 {
     if (!is_null($customSerializer)) {
         $customFieldSerialize = SerializabilityUtilEx::loadCustomFieldSerializer($customSerializer);
         if (is_null($customFieldSerialize)) {
             foreach ($customSerializer->getMethods() as $method) {
                 if ($method->getName() === 'instantiate') {
                     return $method->invoke($this);
                 }
             }
             // Ok to not have one
         } else {
             if ($customFieldSerialize->hasCustomInstantiateInstance()) {
                 return $customFieldSerialize->instantiateInstance($this);
             }
         }
     }
     if ($instanceClass->isArray()) {
         $length = $this->readInt();
         // We don't pre-allocate the array; this prevents an allocation attack
         return new SSSR_BoundedList($instanceClass->getComponentType(), $length);
     } else {
         if ($instanceClass->isEnum()) {
             // Bypass enum transformation
             $ordinal = $this->readInt();
             $values = $instanceClass->getEnumValues();
             assert(in_array($ordinal, $values, true));
             return $ordinal;
         } else {
             $constructor = $instanceClass->getConstructor();
             $constructor->setAccessible(true);
             return $constructor->newInstance();
         }
     }
 }