@@ -138,7 +138,12 @@ private function dumpArray(array &$var, array $parents, int $level, int $column)
138
138
/** @param array<mixed[]|object> $parents */
139
139
private function dumpObject (object $ var , array $ parents , int $ level ): string
140
140
{
141
- if ($ var instanceof \Serializable) {
141
+ $ class = $ var ::class;
142
+ if (method_exists ($ var , '__serialize ' )) {
143
+ $ data = $ this ->dump ($ var ->__serialize ());
144
+ return '\\' . self ::class . "::createObject( \\$ class::class, $ data) " ;
145
+
146
+ } elseif ($ var instanceof \Serializable) { // deprecated
142
147
return 'unserialize( ' . $ this ->dumpString (serialize ($ var )) . ') ' ;
143
148
144
149
} elseif ($ var instanceof \UnitEnum) {
@@ -155,7 +160,6 @@ private function dumpObject(object $var, array $parents, int $level): string
155
160
throw new Nette \InvalidArgumentException ('Cannot dump closure. ' );
156
161
}
157
162
158
- $ class = $ var ::class;
159
163
if ((new \ReflectionObject ($ var ))->isAnonymous ()) {
160
164
throw new Nette \InvalidArgumentException ('Cannot dump anonymous class. ' );
161
165
@@ -270,6 +274,11 @@ private function dumpArguments(array &$var, int $column, bool $named): string
270
274
*/
271
275
public static function createObject (string $ class , array $ props ): object
272
276
{
277
+ if (method_exists ($ class , '__serialize ' )) {
278
+ $ obj = (new \ReflectionClass ($ class ))->newInstanceWithoutConstructor ();
279
+ $ obj ->__unserialize ($ props );
280
+ return $ obj ;
281
+ }
273
282
return unserialize ('O ' . substr (serialize ($ class ), 1 , -1 ) . substr (serialize ($ props ), 1 ));
274
283
}
275
284
}
0 commit comments