/** *Deserialize an object with the given type signature. * * @throws SerializationException * @param string $typeSignature the type signature to deserialize * @return Object the deserialized object */ protected function deserialize($typeSignature) { $this->logger->info("deserialize :" . $typeSignature); $serializedInstRef = SerializabilityUtil::decodeSerializedInstanceReference($typeSignature); $this->logger->info("serializedInstRef : " . $serializedInstRef->getName() . " " . $serializedInstRef->getSignature()); /*MappedClass*/ $instanceClass = $this->mappedClassLoader->loadMappedClass($serializedInstRef->getName()); $instanceClass->setCRC($serializedInstRef->getSignature()); $this->serializationPolicy->validateDeserialize($instanceClass); // {90%} $this->validateTypeVersions($instanceClass, $serializedInstRef); // {cut} // Class customSerializer = SerializabilityUtil.hasCustomFieldSerializer(instanceClass); // instance = instantiate(customSerializer, instanceClass); // rememberDecodedObject(instance); $customSerializer = SerializabilityUtil::hasCustomFieldSerializer($instanceClass); // {100%} $instance = $this->instantiate($customSerializer, $instanceClass); // {100%} $this->rememberDecodedObject(&$instance); $this->deserializeImpl($customSerializer, $instanceClass, &$instance); return $instance; //$instance = $customSerializer->instantiate($this); //$instance = $this->deserializeImpl($customSerializer, $serializedInstRef->getName()); //$instance = $this->deserializeImpl($customSerializer, $serializedInstRef->getName(), $instance); //return $instance; }
public static function getSerializationSignature(Clazz $instanceType, SerializationPolicy $policy) { //TODO improvement for php if ($policy instanceof StandardSerializationPolicy) { return $policy->getIdForClass($instanceType); } else { $result = self::$classCRC32Cache->get($instanceType); if (is_null($result)) { $crc = new CRC32(); self::generateSerializationSignature($instanceType, $crc, $policy); $result = Long::toString($crc->getValue()); self::$classCRC32Cache->put($instanceType, $result); } return $result; } }
/** *Deserialize an object with the given type signature. * * @throws SerializationException * @param string $typeSignature the type signature to deserialize * @return Object the deserialized object */ protected function deserialize($typeSignature) { $this->logger->debug("deserialize :" . $typeSignature); $serializedInstRef = SerializabilityUtil::decodeSerializedInstanceReference($typeSignature); $this->logger->debug("serializedInstRef : " . $serializedInstRef->getName() . " " . $serializedInstRef->getSignature()); /*MappedClass*/ $instanceClass = $this->mappedClassLoader->loadMappedClass($serializedInstRef->getName()); $instanceClass->setCRC($serializedInstRef->getSignature()); assert($this->serializationPolicy !== null); $this->serializationPolicy->validateDeserialize($instanceClass); // {90%} $this->validateTypeVersions($instanceClass, $serializedInstRef); // {cut} // Class customSerializer = SerializabilityUtil.hasCustomFieldSerializer(instanceClass); // instance = instantiate(customSerializer, instanceClass); // rememberDecodedObject(instance); $customSerializer = SerializabilityUtil::hasCustomFieldSerializer($instanceClass); // {100%} $index = $this->reserveDecodedObjectIndex(); $instance = $this->instantiate($customSerializer, $instanceClass); // {100%} $this->rememberDecodedObject($index, $instance); $replacement = $this->deserializeImpl($customSerializer, $instanceClass, $instance); // It's possible that deserializing an object requires the original proxy // object to be replaced. if ($instance !== $replacement) { $this->rememberDecodedObject($index, $instance); $instance = $replacement; } return $instance; //$instance = $customSerializer->instantiate($this); //$instance = $this->deserializeImpl($customSerializer, $serializedInstRef->getName()); //$instance = $this->deserializeImpl($customSerializer, $serializedInstRef->getName(), $instance); //return $instance; }
/** * * * @param Object $instance * @param MappedClass $instanceClass * @ throws SerializationException */ private function serializeClass($instance, MappedClass $instanceClass) { assert($instance != null); /*MappedField[]*/ $declFields = $instanceClass->getDeclaredFields(); /*MappedField[]*/ $serializableFields = SerializabilityUtil::applyFieldSerializationPolicy($declFields); foreach ($serializableFields as $declField) { assert($declField != null); $value = null; $propName = $declField->getName(); $rClass = $instanceClass->getReflectionClass(); //$rClass = new ReflectionObject($instance); if ($rClass == null) { throw new ClassNotFoundException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains ReflectionClass infomration'); } if (!$rClass->hasProperty($propName)) { throw new SerializationException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains property: ' . $propName . ' Did you mapped all properties?'); } $rProperty = $rClass->getProperty($propName); if ($rProperty->isPublic()) { $value = $rProperty->getValue($instance); } else { // not public access to property, we try invoke getter method $propNameSetter = 'get' . strtoupper($propName[0]) . substr($propName, 1, strlen($propName)); if (!$rClass->hasMethod($propNameSetter)) { throw new SerializationException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains getter method for private property: ' . $propName . '. Mapped object should be in pojo style?'); } $rMethod = $rClass->getMethod($propNameSetter); if ($rMethod->isPublic()) { $value = $rMethod->invoke($instance); } else { throw new SerializationException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains public getter method for private property: ' . $propName . '. Mapped object should be in pojo style?'); } } $this->serializeValue($value, $declField->getType()); } /* assert (instance != null); Field[] declFields = instanceClass.getDeclaredFields(); Field[] serializableFields = SerializabilityUtil.applyFieldSerializationPolicy(declFields); for (Field declField : serializableFields) { assert (declField != null); boolean isAccessible = declField.isAccessible(); boolean needsAccessOverride = !isAccessible && !Modifier.isPublic(declField.getModifiers()); if (needsAccessOverride) { // Override the access restrictions declField.setAccessible(true); } Object value; try { value = declField.get(instance); serializeValue(value, declField.getType()); } catch (IllegalArgumentException e) { throw new SerializationException(e); } catch (IllegalAccessException e) { throw new SerializationException(e); } if (needsAccessOverride) { // Restore the access restrictions declField.setAccessible(isAccessible); } } Class<?> superClass = instanceClass.getSuperclass(); if (serializationPolicy.shouldSerializeFields(superClass)) { serializeImpl(instance, superClass); }*/ $superClass = $instanceClass->getSuperclass(); if ($superClass != null && $this->serializationPolicy->shouldDeserializeFields($superClass)) { $this->serializeImpl($instance, $superClass); } }