From 22ee596348c02a5f2d6cc4ce4b7cc59264a54194 Mon Sep 17 00:00:00 2001 From: Ben Ramsey Date: Wed, 8 Jul 2020 15:27:19 -0500 Subject: [PATCH] Make `serialize(UuidInterface)` more compact Resolves #318 --- src/Fields/SerializableFieldsTrait.php | 10 +++++++--- src/Uuid.php | 12 +++++++++--- tests/Rfc4122/FieldsTest.php | 10 ++++++++++ tests/UuidTest.php | 10 ++++++++++ 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/Fields/SerializableFieldsTrait.php b/src/Fields/SerializableFieldsTrait.php index 90f1d49..4ae90be 100644 --- a/src/Fields/SerializableFieldsTrait.php +++ b/src/Fields/SerializableFieldsTrait.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Ramsey\Uuid\Fields; use function base64_decode; -use function base64_encode; +use function strlen; /** * Provides common serialization functionality to fields @@ -39,7 +39,7 @@ trait SerializableFieldsTrait */ public function serialize(): string { - return base64_encode($this->getBytes()); + return $this->getBytes(); } /** @@ -51,6 +51,10 @@ trait SerializableFieldsTrait */ public function unserialize($serialized): void { - $this->__construct(base64_decode($serialized)); + if (strlen($serialized) === 16) { + $this->__construct($serialized); + } else { + $this->__construct(base64_decode($serialized)); + } } } diff --git a/src/Uuid.php b/src/Uuid.php index 0f86cdd..f38e375 100644 --- a/src/Uuid.php +++ b/src/Uuid.php @@ -273,7 +273,7 @@ class Uuid implements UuidInterface */ public function serialize(): string { - return $this->toString(); + return $this->getBytes(); } /** @@ -286,8 +286,14 @@ class Uuid implements UuidInterface */ public function unserialize($serialized): void { - /** @var \Ramsey\Uuid\Uuid $uuid */ - $uuid = self::fromString($serialized); + if (strlen($serialized) === 16) { + /** @var Uuid $uuid */ + $uuid = self::fromBytes($serialized); + } else { + /** @var Uuid $uuid */ + $uuid = self::fromString($serialized); + } + $this->codec = $uuid->codec; $this->numberConverter = $uuid->numberConverter; $this->fields = $uuid->fields; diff --git a/tests/Rfc4122/FieldsTest.php b/tests/Rfc4122/FieldsTest.php index 40282a6..7f4b217 100644 --- a/tests/Rfc4122/FieldsTest.php +++ b/tests/Rfc4122/FieldsTest.php @@ -212,4 +212,14 @@ class FieldsTest extends TestCase $this->assertEquals($fields, $unserializedFields); } + + public function testSerializingFieldsWithOldFormat(): void + { + $fields = new Fields("\xb3\xcd\x58\x6a\xe3\xca\x44\xf3\x98\x8c\xf4\xd6\x66\xc1\xbf\x4d"); + + $serializedFields = 'C:26:"Ramsey\Uuid\Rfc4122\Fields":24:{s81YauPKRPOYjPTWZsG/TQ==}'; + $unserializedFields = unserialize($serializedFields); + + $this->assertEquals($fields, $unserializedFields); + } } diff --git a/tests/UuidTest.php b/tests/UuidTest.php index a77108f..5cbf6c7 100644 --- a/tests/UuidTest.php +++ b/tests/UuidTest.php @@ -1538,6 +1538,16 @@ class UuidTest extends TestCase $this->assertTrue($uuid->equals($unserializedUuid)); } + public function testSerializeWithOldStringFormat(): void + { + $serialized = 'C:26:"Ramsey\Uuid\Rfc4122\UuidV4":36:{b3cd586a-e3ca-44f3-988c-f4d666c1bf4d}'; + + /** @var UuidInterface $unserializedUuid */ + $unserializedUuid = unserialize($serialized); + + $this->assertSame('b3cd586a-e3ca-44f3-988c-f4d666c1bf4d', $unserializedUuid->toString()); + } + public function testUuid3WithEmptyNamespace(): void { $this->expectException(InvalidArgumentException::class);