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()); }
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'); }