diff --git a/src/Serializer.php b/src/Serializer.php index 7829582..afa4786 100644 --- a/src/Serializer.php +++ b/src/Serializer.php @@ -12,6 +12,7 @@ class Serializer { const CLASS_IDENTIFIER_KEY = '@type'; + const CLASS_PARENT_KEY = '@parent'; const SCALAR_TYPE = '@scalar'; const SCALAR_VALUE = '@value'; const NULL_VAR = null; @@ -147,7 +148,7 @@ protected function serializeData($value) // @codeCoverageIgnoreEnd } - if (is_object($value) && $value instanceof \SplFixedArray) { + if ($this->isInstanceOf($value, 'SplFixedArray')) { return SplFixedArraySerializer::serialize($this, $value); } @@ -161,6 +162,20 @@ protected function serializeData($value) return $this->$func($value); } + /** + * Check if a class is instance or extends from the expected instance. + * + * @param mixed $value + * @param string $classFQN + * + * @return bool + */ + private function isInstanceOf($value, $classFQN) + { + return is_object($value) + && (strtolower(get_class($value)) === strtolower($classFQN) || \is_subclass_of($value, $classFQN, true)); + } + /** * @param mixed $value * @@ -224,7 +239,7 @@ protected function unserializeData($value) return $this->getScalarValue($value); } - if (isset($value[self::CLASS_IDENTIFIER_KEY]) && 0 === strcmp($value[self::CLASS_IDENTIFIER_KEY], 'SplFixedArray')) { + if (isset($value[self::CLASS_PARENT_KEY]) && 0 === strcmp($value[self::CLASS_PARENT_KEY], 'SplFixedArray')) { return SplFixedArraySerializer::unserialize($this, $value[self::CLASS_IDENTIFIER_KEY], $value); } diff --git a/src/Serializer/InternalClasses/SplFixedArraySerializer.php b/src/Serializer/InternalClasses/SplFixedArraySerializer.php index 37eeb99..d4505a3 100644 --- a/src/Serializer/InternalClasses/SplFixedArraySerializer.php +++ b/src/Serializer/InternalClasses/SplFixedArraySerializer.php @@ -3,6 +3,7 @@ namespace NilPortugues\Serializer\Serializer\InternalClasses; use NilPortugues\Serializer\Serializer; +use ReflectionClass; use SplFixedArray; class SplFixedArraySerializer @@ -17,6 +18,7 @@ public static function serialize(Serializer $serializer, SplFixedArray $splFixed { $toArray = [ Serializer::CLASS_IDENTIFIER_KEY => get_class($splFixedArray), + Serializer::CLASS_PARENT_KEY => 'SplFixedArray', Serializer::SCALAR_VALUE => [], ]; foreach ($splFixedArray->toArray() as $key => $field) { @@ -31,12 +33,21 @@ public static function serialize(Serializer $serializer, SplFixedArray $splFixed * @param string $className * @param array $value * - * @return object + * @return mixed */ public static function unserialize(Serializer $serializer, $className, array $value) { $data = $serializer->unserialize($value[Serializer::SCALAR_VALUE]); - return $className::fromArray($data); + /* @var SplFixedArray $instance */ + $ref = new ReflectionClass($className); + $instance = $ref->newInstanceWithoutConstructor(); + + $instance->setSize(count($data)); + foreach ($data as $k => $v) { + $instance[$k] = $v; + } + + return $instance; } } diff --git a/tests/DeepCopySerializerTest.php b/tests/DeepCopySerializerTest.php index 7a93e24..a2a79c2 100644 --- a/tests/DeepCopySerializerTest.php +++ b/tests/DeepCopySerializerTest.php @@ -20,6 +20,7 @@ use NilPortugues\Test\Serializer\Dummy\ComplexObject\ValueObject\CommentId; use NilPortugues\Test\Serializer\Dummy\ComplexObject\ValueObject\PostId; use NilPortugues\Test\Serializer\Dummy\ComplexObject\ValueObject\UserId; +use NilPortugues\Test\Serializer\SupportClasses\ChildOfSplFixedArray; use SplFixedArray; class DeepCopySerializerTest extends \PHPUnit_Framework_TestCase @@ -92,4 +93,17 @@ public function testSplFixedArraySerialization() $this->assertEquals($splFixedArray, $serializer->unserialize($serializedObject)); } + + public function testSplFixedArrayChildSerialization() + { + $splFixedArray = new ChildOfSplFixedArray(3); + $splFixedArray[0] = 1; + $splFixedArray[1] = 2; + $splFixedArray[2] = 3; + + $serializer = new DeepCopySerializer(new NullStrategy()); + $serializedObject = $serializer->serialize($splFixedArray); + + $this->assertEquals($splFixedArray, $serializer->unserialize($serializedObject)); + } } diff --git a/tests/SupportClasses/ChildOfSplFixedArray.php b/tests/SupportClasses/ChildOfSplFixedArray.php new file mode 100644 index 0000000..179ec53 --- /dev/null +++ b/tests/SupportClasses/ChildOfSplFixedArray.php @@ -0,0 +1,7 @@ +