public static function hasCustomFieldSerializer(Clazz $instanceType)
 {
     assert($instanceType != null);
     if ($instanceType->isArray()) {
         return null;
     }
     $result = self::$classCustomSerializerCache->get($instanceType);
     if ($result == null) {
         $result = self::computeHasCustomFieldSerializer($instanceType);
         if ($result == null) {
             $result = $instanceType;
         }
         self::$classCustomSerializerCache->put($instanceType, $result);
     }
     return $result === $instanceType ? null : $result;
 }
 private function serializeWithCustomSerializer(Clazz $customSerializer, $instance, Clazz $instanceClass, Clazz $manuallySerializedType)
 {
     assert(!$instanceClass->isArray());
     foreach ($customSerializer->getMethods() as $method) {
         if ($method->getName() === 'serialize') {
             assert($method->isStatic());
             $toReturn = new InvokeCustomFieldSerializerCommand($instanceClass, $customSerializer, $manuallySerializedType);
             $this->identityMap->put($instance, $toReturn);
             $subWriter = new CommandServerSerializationStreamWriter(new HasValuesCommandSink($toReturn), $this->clientOracle, $this->identityMap);
             $method->invoke($subWriter, $instance);
             return $toReturn;
         }
     }
     throw new NoSuchMethodException('Could not find serialize method in custom serializer ' . $customSerializer->getName());
 }
示例#3
0
 private static function printTypeName(Clazz $type)
 {
     // Primitives
     //
     if ($type === Integer::typeClass()) {
         return 'int';
     } else {
         if ($type === Long::typeClass()) {
             return 'long';
         } else {
             if ($type === Short::typeClass()) {
                 return 'short';
             } else {
                 if ($type === Byte::typeClass()) {
                     return 'byte';
                 } else {
                     if ($type === Character::typeClass()) {
                         return 'char';
                     } else {
                         if ($type === Boolean::typeClass()) {
                             return 'boolean';
                         } else {
                             if ($type === Float::typeClass()) {
                                 return 'float';
                             } else {
                                 if ($type === Double::typeClass()) {
                                     return 'double';
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     // Arrays
     //
     if ($type->isArray()) {
         $componentType = $type->getComponentType();
         return self::printTypeName($componentType) . '[]';
     }
     // Everything else
     //
     return str_replace('$', '.', $type->getName());
 }
 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();
         }
     }
 }
 private function getJavahSignatureName(Clazz $clazz)
 {
     if ($clazz->isArray()) {
         $leafType = $clazz;
         $dims = 0;
         do {
             $dims++;
             $leafType = $leafType->getComponentType();
         } while (!is_null($leafType->getComponentType()));
         assert($dims > 0);
         $s = $this->getJavahSignatureName($leafType);
         for ($i = 0; $i < $dims; ++$i) {
             $s = '_3' . $s;
         }
         return $s;
     } else {
         if ($clazz->isPrimitive()) {
             return WebModeClientOracle::jsniName($clazz);
         } else {
             $name = $clazz->getFullName();
             $name = str_replace('_', '_1', $name);
             $name = str_replace('.', '_', $name);
             return 'L' . $name . '_2';
         }
     }
 }
 private function isInstantiable(Clazz $clazz)
 {
     if ($clazz->isPrimitive()) {
         return true;
     }
     if ($clazz->isArray()) {
         return $this->isInstantiable($clazz->getComponentType());
     }
     if (Classes::classOf('IsSerializable')->isAssignableFrom($clazz)) {
         return true;
     }
     return Serializability::hasCustomFieldSerializer($clazz) != null;
 }
 private function canonicalName(Clazz $clazz)
 {
     if ($clazz->isArray()) {
         $leafType = $clazz;
         do {
             $leafType = $leafType->getComponentType();
         } while ($leafType->isArray());
         $enclosing = $leafType->getEnclosingClass();
         if (!is_null($enclosing)) {
             // com.foo.Enclosing$Name[]
             return $this->canonicalName($enclosing) . '$' . $clazz->getName();
         } else {
             if ($leafType->getPackage() === '') {
                 // Name0[
                 return $clazz->getName();
             } else {
                 // com.foo.Name[]
                 return $leafType->getPackage() . '.' . $clazz->getName();
             }
         }
     } else {
         return $clazz->getFullName();
     }
 }
 private function serializeWithCustomSerializer(Clazz $customSerializer, $instance, Clazz $instanceClass)
 {
     assert(!$instanceClass->isArray());
     foreach ($customSerializer->getMethods() as $method) {
         if ($method->getName() === 'serialize') {
             $method->invoke($this, $instance);
             return;
         }
     }
     throw new NoSuchMethodException('serialize');
 }