Skip to content

Commit eaa9d4c

Browse files
author
Nil Portugues Caldero
committed
Serialization of SplFixedArray and classes extending from it
1 parent b2406cc commit eaa9d4c

File tree

4 files changed

+51
-4
lines changed

4 files changed

+51
-4
lines changed

src/Serializer.php

+17-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
class Serializer
1313
{
1414
const CLASS_IDENTIFIER_KEY = '@type';
15+
const CLASS_PARENT_KEY = '@parent';
1516
const SCALAR_TYPE = '@scalar';
1617
const SCALAR_VALUE = '@value';
1718
const NULL_VAR = null;
@@ -147,7 +148,7 @@ protected function serializeData($value)
147148
// @codeCoverageIgnoreEnd
148149
}
149150

150-
if (is_object($value) && $value instanceof \SplFixedArray) {
151+
if ($this->isInstanceOf($value, 'SplFixedArray')) {
151152
return SplFixedArraySerializer::serialize($this, $value);
152153
}
153154

@@ -161,6 +162,20 @@ protected function serializeData($value)
161162
return $this->$func($value);
162163
}
163164

165+
/**
166+
* Check if a class is instance or extends from the expected instance.
167+
*
168+
* @param mixed $value
169+
* @param string $classFQN
170+
*
171+
* @return bool
172+
*/
173+
private function isInstanceOf($value, $classFQN)
174+
{
175+
return is_object($value)
176+
&& (strtolower(get_class($value)) === strtolower($classFQN) || \is_subclass_of($value, $classFQN, true));
177+
}
178+
164179
/**
165180
* @param mixed $value
166181
*
@@ -224,7 +239,7 @@ protected function unserializeData($value)
224239
return $this->getScalarValue($value);
225240
}
226241

227-
if (isset($value[self::CLASS_IDENTIFIER_KEY]) && 0 === strcmp($value[self::CLASS_IDENTIFIER_KEY], 'SplFixedArray')) {
242+
if (isset($value[self::CLASS_PARENT_KEY]) && 0 === strcmp($value[self::CLASS_PARENT_KEY], 'SplFixedArray')) {
228243
return SplFixedArraySerializer::unserialize($this, $value[self::CLASS_IDENTIFIER_KEY], $value);
229244
}
230245

src/Serializer/InternalClasses/SplFixedArraySerializer.php

+13-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace NilPortugues\Serializer\Serializer\InternalClasses;
44

55
use NilPortugues\Serializer\Serializer;
6+
use ReflectionClass;
67
use SplFixedArray;
78

89
class SplFixedArraySerializer
@@ -17,6 +18,7 @@ public static function serialize(Serializer $serializer, SplFixedArray $splFixed
1718
{
1819
$toArray = [
1920
Serializer::CLASS_IDENTIFIER_KEY => get_class($splFixedArray),
21+
Serializer::CLASS_PARENT_KEY => 'SplFixedArray',
2022
Serializer::SCALAR_VALUE => [],
2123
];
2224
foreach ($splFixedArray->toArray() as $key => $field) {
@@ -31,12 +33,21 @@ public static function serialize(Serializer $serializer, SplFixedArray $splFixed
3133
* @param string $className
3234
* @param array $value
3335
*
34-
* @return object
36+
* @return mixed
3537
*/
3638
public static function unserialize(Serializer $serializer, $className, array $value)
3739
{
3840
$data = $serializer->unserialize($value[Serializer::SCALAR_VALUE]);
3941

40-
return $className::fromArray($data);
42+
/* @var SplFixedArray $instance */
43+
$ref = new ReflectionClass($className);
44+
$instance = $ref->newInstanceWithoutConstructor();
45+
46+
$instance->setSize(count($data));
47+
foreach ($data as $k => $v) {
48+
$instance[$k] = $v;
49+
}
50+
51+
return $instance;
4152
}
4253
}

tests/DeepCopySerializerTest.php

+14
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use NilPortugues\Test\Serializer\Dummy\ComplexObject\ValueObject\CommentId;
2121
use NilPortugues\Test\Serializer\Dummy\ComplexObject\ValueObject\PostId;
2222
use NilPortugues\Test\Serializer\Dummy\ComplexObject\ValueObject\UserId;
23+
use NilPortugues\Test\Serializer\SupportClasses\ChildOfSplFixedArray;
2324
use SplFixedArray;
2425

2526
class DeepCopySerializerTest extends \PHPUnit_Framework_TestCase
@@ -92,4 +93,17 @@ public function testSplFixedArraySerialization()
9293

9394
$this->assertEquals($splFixedArray, $serializer->unserialize($serializedObject));
9495
}
96+
97+
public function testSplFixedArrayChildSerialization()
98+
{
99+
$splFixedArray = new ChildOfSplFixedArray(3);
100+
$splFixedArray[0] = 1;
101+
$splFixedArray[1] = 2;
102+
$splFixedArray[2] = 3;
103+
104+
$serializer = new DeepCopySerializer(new NullStrategy());
105+
$serializedObject = $serializer->serialize($splFixedArray);
106+
107+
$this->assertEquals($splFixedArray, $serializer->unserialize($serializedObject));
108+
}
95109
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace NilPortugues\Test\Serializer\SupportClasses;
4+
5+
class ChildOfSplFixedArray extends \SplFixedArray
6+
{
7+
}

0 commit comments

Comments
 (0)