diff --git a/src/core/etl/src/Flow/ETL/ConfigBuilder.php b/src/core/etl/src/Flow/ETL/ConfigBuilder.php index cb5911f10..206f7046a 100644 --- a/src/core/etl/src/Flow/ETL/ConfigBuilder.php +++ b/src/core/etl/src/Flow/ETL/ConfigBuilder.php @@ -11,7 +11,7 @@ use Flow\ETL\Monitoring\Memory\Unit; use Flow\ETL\Pipeline\Optimizer; use Flow\ETL\Row\Factory\NativeEntryFactory; -use Flow\Serializer\{NativePHPSerializer, Serializer}; +use Flow\Serializer\{Base64Serializer, NativePHPSerializer, Serializer}; final class ConfigBuilder { @@ -52,7 +52,7 @@ public function build() : Config { $this->id ??= \uniqid('flow_php', true); $entryFactory = new NativeEntryFactory(); - $this->serializer ??= new NativePHPSerializer(); + $this->serializer ??= new Base64Serializer(new NativePHPSerializer()); $cachePath = \is_string(\getenv(Config::CACHE_DIR_ENV)) && \realpath(\getenv(Config::CACHE_DIR_ENV)) ? \getenv(Config::CACHE_DIR_ENV) : \sys_get_temp_dir() . '/flow_php/cache'; diff --git a/src/core/etl/src/Flow/Serializer/Base64Serializer.php b/src/core/etl/src/Flow/Serializer/Base64Serializer.php new file mode 100644 index 000000000..d448a69ef --- /dev/null +++ b/src/core/etl/src/Flow/Serializer/Base64Serializer.php @@ -0,0 +1,23 @@ +serializer->serialize($serializable)); + } + + public function unserialize(string $serialized, string $class) : object + { + /** @phpstan-ignore-next-line */ + return $this->serializer->unserialize(\base64_decode($serialized, true), $class); + } +} diff --git a/src/core/etl/tests/Flow/Serializer/Tests/Unit/Base64SerializerTest.php b/src/core/etl/tests/Flow/Serializer/Tests/Unit/Base64SerializerTest.php new file mode 100644 index 000000000..14fd68aaf --- /dev/null +++ b/src/core/etl/tests/Flow/Serializer/Tests/Unit/Base64SerializerTest.php @@ -0,0 +1,50 @@ + row( + int_entry('integer', 1), + str_entry('string', 'string'), + bool_entry('boolean', true), + datetime_entry('datetime', new \DateTimeImmutable('2022-01-01 00:00:00')), + str_entry('null', null), + float_entry('float', 0.12), + object_entry('object', new \ArrayIterator([1, 2, 3])), + struct_entry( + 'struct', + ['integer' => 1, 'string' => 'string'], + struct_type([ + struct_element('integer', type_int()), + struct_element('string', type_string()), + ]) + ) + ), + \range(0, 100) + ) + ); + + $serializer = new Base64Serializer(new NativePHPSerializer()); + + $serialized = $serializer->serialize($rows); + + $unserialized = $serializer->unserialize($serialized, Rows::class); + + self::assertEquals( + $rows, + $unserialized + ); + } +}