cloudcastle/serialize

Production-ready PHP 8.1+ package (CloudCastle Serialize).

Maintainers

Package info

github.com/cloudcastle-apps/serialize

Homepage

Documentation

pkg:composer/cloudcastle/serialize

Transparency log

Statistics

Installs: 21

Dependents: 1

Suggesters: 0

Stars: 1

Open Issues: 1

v1.0.1 2026-07-16 17:03 UTC

README

Version PHP Version License Total Downloads Monthly Downloads Packagist Stars Dependents Suggesters Security Advisories

Quality CodeQL GitHub Stars GitHub Forks GitHub Issues Latest Release Last Commit Contributors

Coverage Mutation MSI OpenSSF Scorecard PHPStan Psalm Code Style

Безопасная сериализация для PHP 8.1+: объекты запрещены при десериализации по умолчанию (защита от POP-гаджетов), HMAC-подпись нагрузки из коробки, fail-safe исключения вместо тихого false. Пять форматов под единым фасадом — быстрее всех сравниваемых библиотек. Ноль зависимостей.

Установка

composer require cloudcastle/serialize

Требуется PHP 8.1+. Runtime-зависимостей нет. Для формата igbinary — расширение ext-igbinarysuggest).

Быстрый старт

<?php

use CloudCastle\Serialize\Serializer;

// PHP-формат: объекты запрещены по умолчанию — POP-цепочки исключены
$payload = Serializer::php()->serialize(['id' => 1, 'items' => [2, 3]]);
$value   = Serializer::php()->unserialize($payload);           // только скаляры/массивы
$order   = Serializer::php([Order::class])->unserialize($blob); // объекты — по whitelist

// JSON: fail-safe исключения, UTF-8, сохранение типа float
$json = Serializer::json()->serialize(['город' => 'Казань']);  // {"город":"Казань"}
$data = Serializer::json()->unserialize($json);                // исключение на битом JSON

// Подписанная нагрузка (tamper-proof) для cookie / очередей / кэша
$signed = Serializer::signed($secretKey);                      // ключ ≥ 32 байт
$sealed = $signed->seal(['user_id' => 5, 'role' => 'admin']);
$restored = $signed->unseal($sealed);                          // исключение при подделке

// Экспорт в исполняемый PHP-код (конфиги, кэш-файлы под opcache)
file_put_contents('config.php', Serializer::exporter()->exportFile($settings));

// Нормализация объектов: DTO ↔ массив по типам конструктора
$array = Serializer::mapper()->toArray($orderDto);
$dto   = Serializer::mapper()->fromArray(OrderDto::class, $array);

Возможности

  • PhpSerializer — нативный формат с анти-POP по умолчанию: allowed_classes = false, явный whitelist классов, глубокая проверка вложенных объектов (подставные классы дают исключение, а не молчаливый __PHP_Incomplete_Class), лимит длины нагрузки.
  • JsonSerializer — fail-safe JSON: исключения вместо тихого false/null, UTF-8 без экранирования, JSON_PRESERVE_ZERO_FRACTION, лимиты глубины и длины.
  • IgbinarySerializer — компактный бинарный формат (требует ext-igbinary).
  • SignedSerializer — HMAC-SHA256-подпись поверх любого формата: seal/unseal с проверкой константным временем (hash_equals); подделка и усечение отклоняются до разбора.
  • PhpExporter — экспорт значений в валидный PHP-код (короткие массивы, enum, даты, stdClass) — исполняется opcache быстрее любого формата десериализации.
  • ObjectMapper — нормализация объект ↔ массив через рефлексию конструктора: promoted и private свойства, enum, DateTimeImmutable, вложенные объекты; без атрибутов на DTO.
  • Serializer — единый фасад со статическими фабриками всех форматов и декораторов.

Функционально пакет покрывает возможности сравниваемых аналогов вместе взятых: laminas/laminas-serializer, symfony/serializer, jms/serializer, brick/varexporter.

Безопасность как дифференциатор

  • Анти-POP по умолчаниюSerializer::php()->unserialize() не восстанавливает объекты без явного whitelist. Классические POP-цепочки (гаджеты через __wakeup/__destruct) исключены по построению — то, чего нет ни у одного из сравниваемых аналогов.
  • HMAC-подпись из коробкиSignedSerializer делает нагрузки для cookie, очередей и межсервисного обмена tamper-proof без ручного кода подписи.
  • DoS-лимиты — ограничение длины нагрузки и глубины JSON защищают от исчерпания памяти и стека на враждебном вводе.
  • Fail-safe везде — любая ошибка формата даёт контрактное исключение, а не тихий false/null, который «утёк» бы дальше по коду.

Возможности против аналогов

Легенда: ✅ полностью · ⚠️ частично · 🔌 адаптер · ❌ нет · — неприменимо.

Сгенерировано из tools/features-data.php (факты о поддержке). Легенда: ✅ полностью · ⚠️ частично · 🔌 адаптер · ❌ нет · — неприменимо.

Форматы

Функция Serialize laminas symfony jms brick 🏆 Победитель
PHP serialize/unserialize Serialize, laminas
JSON Паритет
igbinary (бинарный) Serialize, laminas
Экспорт в PHP-код (opcache) Serialize, brick

Безопасность

Функция Serialize laminas symfony jms brick 🏆 Победитель
Анти-POP: объекты запрещены по умолчанию Serialize
Whitelist классов при десериализации ⚠️ ⚠️ Serialize
Глубокая проверка вложенных классов Serialize
HMAC-подпись нагрузки из коробки Serialize
Лимит длины нагрузки (DoS-защита) Serialize
Лимит глубины JSON ⚠️ ⚠️ Serialize
Fail-safe исключения (не тихий false/null) ⚠️ Паритет

Нормализация объектов

Функция Serialize laminas symfony jms brick 🏆 Победитель
Объект ↔ массив по типам конструктора Паритет
Восстановление enum ⚠️ Serialize, symfony
Восстановление DateTimeImmutable Паритет
Promoted/private свойства ⚠️ Serialize, symfony
Без аннотаций/атрибутов на DTO Serialize, symfony

Инфраструктура

Функция Serialize laminas symfony jms brick 🏆 Победитель
Единый фасад для всех форматов ⚠️ ⚠️ ⚠️ Serialize
Zero runtime-зависимостей ⚠️ Serialize, brick
Bounded-кэш рефлексии ⚠️ ⚠️ Serialize

Производительность

Функция Serialize laminas symfony jms brick 🏆 Победитель
PHP serialize (vs аналоги) ⚠️ Serialize
JSON encode/decode (vs аналоги) ⚠️ Serialize
Экспорт в PHP-код (vs аналоги) ⚠️ Serialize
Fast-path обхода анти-POP для скаляров Serialize

Качество

Функция Serialize laminas symfony jms brick 🏆 Победитель
100% покрытие всеми видами тестов ⚠️ ⚠️ ⚠️ Serialize
Мутационное тестирование (MSI 100%) Serialize
Нагрузочные и перф-тесты в CI Serialize

Производительность

Изолированные замеры без Xdebug (composer compare), эквивалентные операции над одинаковыми данными. Метрика — ops/sec (больше — лучше); «—» — операция не поддерживается. Сравнение — против конкурирующих библиотек (сырые примитивы, которые мы оборачиваем ради безопасности, не участвуют).

Сгенерировано из composer compare (PHP 8.1.34). Правки в блоке будут перезаписаны.

Сценарий cloudcastle/serialize laminas/laminas-serializer opis/closure symfony/serializer jms/serializer brick/varexporter 🏆 Победитель
PHP serialize (массив) 1437193 ops/s 806124 ops/s 123290 ops/s cloudcastle/serialize
PHP unserialize (массив) 666265 ops/s 524757 ops/s 178398 ops/s cloudcastle/serialize
JSON encode 1882711 ops/s 776313 ops/s 110891 ops/s 100276 ops/s cloudcastle/serialize
JSON decode 487863 ops/s 431862 ops/s 417581 ops/s 169810 ops/s cloudcastle/serialize
Экспорт в PHP-код 168734 ops/s 37475 ops/s cloudcastle/serialize
igbinary serialize 2020816 ops/s 1011992 ops/s cloudcastle/serialize
igbinary unserialize 1148841 ops/s 825529 ops/s cloudcastle/serialize

Полное сравнение — в Wiki: Сравнение.

Заключение: когда что выбирать

Сильные стороны cloudcastle/serialize — безопасность сериализации как встроенное свойство (анти-POP, подпись, DoS-лимиты), пять форматов под единым фасадом, ноль runtime-зависимостей и production-обвязка (100% покрытие пятью видами тестов, Infection MSI 100%, полный статанализ). По скорости пакет обгоняет все сравниваемые библиотеки в каждом сценарии таблицы выше: PHP serialize ×1.7 к laminas, JSON encode ×2.3 к laminas и ×16 к symfony, экспорт в PHP-код ×4.4 к brick/varexporter — при том, что делает больше работы (проверки безопасности). Fast-path обхода анти-POP пропускает глубокую проверку для скаляров и массивов, так что типовой случай не платит за безопасность.

Честные рекомендации:

  • Безопасная сериализация, финтех, недоверенные данные, подпись нагрузокcloudcastle/serialize.
  • Глубокая интеграция с Symfony, сложный маппинг с группами/атрибутамиsymfony/serializer.
  • Богатая аннотационная конфигурация маппингаjms/serializer.
  • Только экспорт в PHP-код с расширенными опциямиbrick/varexporter.
  • Набор адаптеров форматов для Laminas-проектаlaminas/laminas-serializer.

Документация

Качество

Пакет придерживается production-стандартов: строгая типизация, полный статический анализ (PHPStan max, Psalm level 1, PHPMD, Deptrac, Rector), покрытие тестами 100% на каждый файл и мутационное тестирование (Infection MSI 100%). Матрица CI — PHP 8.1–8.5.

composer ci        # полный пайплайн качества
composer check     # быстрые проверки перед коммитом
composer test      # тесты (unit + integration + security + load)
composer compare   # сравнение производительности с аналогами

Контакты

Поддержать проект

Реквизиты для поддержки автора — в DONATE.md.

Contributors

Спасибо всем, кто вносит вклад в проект:

Список ведётся по спецификации all-contributors.

Лицензия

MIT © CloudCastle