cloudcastle / serialize
Production-ready PHP 8.1+ package (CloudCastle Serialize).
Requires
- php: >=8.1
Requires (Dev)
- brick/varexporter: ^0.6.0
- deptrac/deptrac: ^3.0 || ^4.0
- ergebnis/composer-normalize: ^2.45
- friendsofphp/php-cs-fixer: ^3.75
- icanhazstring/composer-unused: ^0.9
- infection/infection: ^0.29 || ^0.33
- jms/serializer: ^3.32
- laminas/laminas-serializer: ^2.18
- opis/closure: ^4.5
- php-parallel-lint/php-parallel-lint: ^1.4
- phpdocumentor/shim: ^3.7
- phpmd/phpmd: ^2.15
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.12 || ^2.1
- phpstan/phpstan-deprecation-rules: ^1.2 || ^2.0
- phpstan/phpstan-phpunit: ^1.4 || ^2.0
- phpstan/phpstan-strict-rules: ^1.6 || ^2.0
- phpunit/phpunit: ^10.5 || ^11.5
- psalm/plugin-phpunit: ^0.19 || ^0.20
- rector/rector: ^1.2 || ^2.0
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^3.12 || ^4.0
- symfony/serializer: ^6.4
- vimeo/psalm: ^6.0
- webmozart/assert: ^1.11
This package is auto-updated.
Last update: 2026-07-16 17:16:17 UTC
README
Безопасная сериализация для PHP 8.1+: объекты запрещены при десериализации по умолчанию (защита от POP-гаджетов), HMAC-подпись нагрузки из коробки, fail-safe исключения вместо тихого
false. Пять форматов под единым фасадом — быстрее всех сравниваемых библиотек. Ноль зависимостей.
Установка
composer require cloudcastle/serialize
Требуется PHP 8.1+. Runtime-зависимостей нет. Для формата igbinary — расширение
ext-igbinary (в suggest).
Быстрый старт
<?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.
Документация
- Wiki — руководство пользователя
- Быстрый старт
- Возможности (Features)
- Сравнение с аналогами
- Архитектура
- API-документация
Качество
Пакет придерживается 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 # сравнение производительности с аналогами
Контакты
- Email — alex-4-17@yandex.ru
- VK — https://vk.com/leha_zorin
- Telegram — @CloudCastle85
- Телефон — +79872763991
- Сетка — https://set.ki/LdYRz76
Поддержать проект
Реквизиты для поддержки автора — в DONATE.md.
Contributors
Спасибо всем, кто вносит вклад в проект:
Список ведётся по спецификации all-contributors.
Лицензия
MIT © CloudCastle