SerializeMethod) { // - стандартный метод UnSerialize ObjectArraySerializeMethod::Serialize => self::UnSerializeBySerialize($serialized), // - метод JsonEncode ObjectArraySerializeMethod::JsonEncode => self::UnSerializeByJsonEncode($serialized), // - метод JsonEncodeWithToArray ObjectArraySerializeMethod::JsonEncodeWithToArray => self::UnSerializeByJsonEncodeWithToArray($serialized, $options->OnClassFrom) }; } /** * Десериализует массив объектов с помощью стандартного метода UnSerialize. * * @param string $serialized Сериализованный массив. * * @return ObjectArray Массив объектов. */ private static function UnSerializeBySerialize (string $serialized): ObjectArray { // Создаем новый объект $result = new ObjectArray(); // Десериализуем массив объектов с помощью стандартного метода $result->UnSerialize($serialized); // Возвращаем результат return $result; } /** * Десериализует массив объектов с помощью метода JsonEncode. * * @param string $serialized Сериализованный массив. * * @return ObjectArray Массив объектов. */ private static function UnSerializeByJsonEncode (string $serialized): ObjectArray { // Десериализуем массив $container = json_decode($serialized, false, flags: JSON_UNESCAPED_UNICODE); // Создаем новый объект return new ObjectArray($container); } /** * Десериализует массив объектов с помощью метода JsonEncodeWithToArray. * * @param string $serialized Сериализованный массив. * @param callable|null $onClass Функция обратного вызова для десериализации объекта методом JsonEncodeWithToArray. * Она передается в качестве параметра в функцию FromArray и служит для правильного преобразования массива в * тип. * * @return ObjectArray Массив объектов. */ private static function UnSerializeByJsonEncodeWithToArray (string $serialized, ?callable $onClass): ObjectArray { // Десериализуем массив $container = json_decode($serialized, true, flags: JSON_UNESCAPED_UNICODE); // Создаем новый объект, в который будем помещать объекты $result = new ObjectArray(); // Переберем все объекты в контейнере foreach ($container as $item) try { // - пробуем преобразовать массив в объект, если это возможно $result[] = TypeExtension::FromArray($item, $onClass); } catch (TypeException) { // - если не получилось, то просто добавляем объект в массив $result[] = $item; } // Возвращаем результат return $result; } /** * Сериализует массив объектов. * * @param ObjectArraySerializeOptions|null $options Настройки сериализации. По умолчанию используется настройка по * умолчанию. * * @return string Сериализованный массив. */ public function SerializeEx (?ObjectArraySerializeOptions $options = null): string { // По умолчанию используем настройки по умолчанию $options ??= new ObjectArraySerializeOptions(); // Сериализуем массив return match ($options->SerializeMethod) { // - стандартный метод Serialize ObjectArraySerializeMethod::Serialize => $this->Serialize(), // - метод JsonEncode ObjectArraySerializeMethod::JsonEncode => $this->SerializeByJsonEncode(), // - метод JsonEncodeWithToArray ObjectArraySerializeMethod::JsonEncodeWithToArray => $this->SerializeByJsonEncodeWithToArray($options->OnClassTo) }; } /** * Сериализует массив методом JsonEncode. * * @return string Сериализованный массив. */ private function SerializeByJsonEncode (): string { return json_encode($this->Container, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); } /** * Сериализует массив методом JsonEncodeWithToArray. * * @param callable|null $onClass Функция обратного вызова для сериализации объекта методом JsonEncodeWithToArray. * Она передается в качестве параметра в функцию ToArray и служит для правильного преобразования типа в массив. * * @return string Сериализованный массив. */ private function SerializeByJsonEncodeWithToArray (?callable $onClass): string { // Создадим массив, в который будем помещать объекты $container = []; // Переберем все объекты в контейнере foreach ($this->Container as $item) try { // - пробуем преобразовать объект в массив, если это возможно $container[] = TypeExtension::ToArray($item, $onClass); } catch (TypeException) { // - если не получилось, то просто добавляем объект в массив $container[] = $item; } // Возвращаем сериализованный массив return json_encode($container, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); } }