/**
  *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);
     }
 }