Skip to content

Commit

Permalink
Serializers: refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
f3l1x committed Jul 10, 2021
1 parent 4707e5a commit a875ec4
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 48 deletions.
51 changes: 5 additions & 46 deletions src/Serializer/DefaultSerializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,65 +2,24 @@

namespace Contributte\Redis\Serializer;

use Contributte\Redis\Exception\LogicalException;

final class DefaultSerializer implements Serializer
{

private const SERIALIZE_IGBINARY = 2;
private const SERIALIZE_PHP = 1;

private const META_SERIALIZED = 'serialized';

/** @var bool */
private $igbinary;

public function __construct()
{
$this->igbinary = extension_loaded('igbinary');
}

/**
* @param mixed $data
* @param mixed[] $meta
* @return string
* {@inheritDoc}
*/
public function serialize($data, array &$meta): string
{
if ($this->igbinary) {
$meta[self::META_SERIALIZED] = self::SERIALIZE_IGBINARY;
return @igbinary_serialize($data);
}

if (!is_string($data)) {
$meta[self::META_SERIALIZED] = self::SERIALIZE_PHP;
return @serialize($data);
}

return $data;
return @serialize($data);
}


/**
* @param string $data
* @param mixed[] $meta
* @return mixed
* {@inheritDoc}
*/
public function unserialize(string $data, array $meta)
{
switch ($meta[self::META_SERIALIZED] ?? 0) {
case self::SERIALIZE_IGBINARY:
if ($this->igbinary) {
return @igbinary_unserialize($data);
}

throw new LogicalException('Incompatible serialization method, igbinary is missing but required.');

case self::SERIALIZE_PHP:
return @unserialize($data);

default:
return $data;
}
return @unserialize($data);
}

}
24 changes: 24 additions & 0 deletions src/Serializer/IgbinarySerializer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php declare(strict_types = 1);

namespace Contributte\Redis\Serializer;

final class IgbinarySerializer implements Serializer
{

/**
* {@inheritDoc}
*/
public function serialize($data, array &$meta): string
{
return @igbinary_serialize($data);
}

/**
* {@inheritDoc}
*/
public function unserialize(string $data, array $meta)
{
return @igbinary_unserialize($data);
}

}
2 changes: 0 additions & 2 deletions src/Serializer/Serializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@ interface Serializer
/**
* @param mixed $data
* @param mixed[] $meta
* @return string
*/
public function serialize($data, array &$meta): string;

/**
* @param string $data
* @param mixed[] $meta
* @return mixed
*/
Expand Down
20 changes: 20 additions & 0 deletions tests/cases/Serializer/DefaultSerializer.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php declare(strict_types = 1);

namespace Tests\Cases\Redis\Serializer;

use Contributte\Redis\Serializer\DefaultSerializer;
use Ninjify\Nunjuck\Toolkit;
use Tester\Assert;

require_once __DIR__ . '/../../bootstrap.php';

Toolkit::test(function (): void {
$serializer = new DefaultSerializer();
$meta = [];

Assert::equal('s:3:"foo";', $serializer->serialize('foo', $meta));
Assert::equal('a:1:{s:3:"foo";s:3:"bar";}', $serializer->serialize(['foo' => 'bar'], $meta));

Assert::equal('foo', $serializer->unserialize('s:3:"foo";', $meta));
Assert::equal(['foo' => 'bar'], $serializer->unserialize('a:1:{s:3:"foo";s:3:"bar";}', $meta));
});
24 changes: 24 additions & 0 deletions tests/cases/Serializer/IgbinarySerializer.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php declare(strict_types = 1);

/**
* @phpExtension igbinary
*/

namespace Tests\Cases\Redis\Serializer;

use Contributte\Redis\Serializer\IgbinarySerializer;
use Ninjify\Nunjuck\Toolkit;
use Tester\Assert;

require_once __DIR__ . '/../../bootstrap.php';

Toolkit::test(function (): void {
$serializer = new IgbinarySerializer();
$meta = [];

Assert::equal("\x00\x00\x00\x02\x11\x03foo", $serializer->serialize('foo', $meta));
Assert::equal("\x00\x00\x00\x02\x14\x01\x11\x03foo\x11\x03bar", $serializer->serialize(['foo' => 'bar'], $meta));

Assert::equal('foo', $serializer->unserialize("\x00\x00\x00\x02\x11\x03foo", $meta));
Assert::equal(['foo' => 'bar'], $serializer->unserialize("\x00\x00\x00\x02\x14\x01\x11\x03foo\x11\x03bar", $meta));
});

0 comments on commit a875ec4

Please sign in to comment.