PHPackages                             monkeyscloud/monkeyslegion-serializer - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. monkeyscloud/monkeyslegion-serializer

ActiveLibrary[Parsing &amp; Serialization](/categories/parsing)

monkeyscloud/monkeyslegion-serializer
=====================================

Attribute-driven object↔JSON/XML serializer for MonkeysLegion: property hooks, readonly DTOs, normalizer pipeline, naming strategies, PHPStan Level 9.

1.0.0(3w ago)01↓100%1MITPHPPHP ^8.4

Since May 17Pushed 3w agoCompare

[ Source](https://github.com/MonkeysCloud/MonkeysLegion-Serializer)[ Packagist](https://packagist.org/packages/monkeyscloud/monkeyslegion-serializer)[ RSS](/packages/monkeyscloud-monkeyslegion-serializer/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (2)Versions (2)Used By (1)

MonkeysLegion Serializer
========================

[](#monkeyslegion-serializer)

Attribute-driven **object↔JSON/XML** serializer for the MonkeysLegion v2 framework.

PHP 8.4 property hooks • readonly DTOs • backed enums • typed collections • serialization groups • naming strategies • polymorphic discriminators • PHPStan Level 9

---

Installation
------------

[](#installation)

```
composer require monkeyscloud/monkeyslegion-serializer
```

**Requirements:** PHP ≥ 8.4 · ext-json · ext-simplexml · ext-dom

---

Quick Start
-----------

[](#quick-start)

```
use MonkeysLegion\Serializer\Serializer;
use MonkeysLegion\Serializer\Attribute\{Serializable, SerializedName, Ignore, Groups, Type, DateFormat};

#[Serializable]
class User
{
    public function __construct(
        public readonly int $id,
        public readonly string $name,

        #[SerializedName('email_address')]
        public readonly string $email,

        #[Ignore]
        public readonly string $passwordHash,

        #[Groups(['admin'])]
        public readonly string $role = 'user',

        #[DateFormat('Y-m-d')]
        public readonly \DateTimeImmutable $createdAt = new \DateTimeImmutable(),
    ) {}
}

$serializer = Serializer::create();

// Serialize to JSON
$json = $serializer->toJson(new User(
    id: 1,
    name: 'Jorge',
    email: 'jorge@monkeys.cloud',
    passwordHash: 'hashed',
    role: 'admin',
));
// {"id":1,"name":"Jorge","email_address":"jorge@monkeys.cloud","role":"admin","created_at":"2026-05-17"}

// Deserialize from JSON
$user = $serializer->fromJson($json, User::class);
echo $user->name; // Jorge
```

---

Attributes Reference
--------------------

[](#attributes-reference)

AttributeTargetDescription`#[Serializable]`ClassMark class as serializable (optional groups, xmlRoot)`#[SerializedName('x')]`PropertyOverride the output key name`#[Ignore]`PropertyExclude from serialization &amp; deserialization`#[Groups(['api'])]`PropertyInclude only when group is active`#[Type(Item::class)]`PropertyHint collection item type`#[DateFormat('Y-m-d')]`PropertyCustom date format`#[MaxDepth(2)]`PropertyLimit nesting depth for this property`#[Accessor(getter:, setter:)]`PropertyCustom getter/setter for private properties`#[Transform(serialize:, deserialize:)]`PropertyCustom value transform callbacks`#[PreSerialize]`MethodHook: runs before serialization`#[PostDeserialize]`MethodHook: runs after deserialization`#[Discriminator]`ClassPolymorphic type mapping`#[XmlRoot('user')]`ClassXML root element name`#[XmlElement('item')]`PropertyXML child element name`#[XmlAttribute]`PropertySerialize as XML attribute---

Lifecycle Hooks
---------------

[](#lifecycle-hooks)

```
use MonkeysLegion\Serializer\Attribute\{PreSerialize, PostDeserialize};

class Order
{
    public int $id;
    public float $subtotal;
    public float $tax;
    public float $total = 0;

    #[PreSerialize]
    public function computeTotal(): void
    {
        $this->total = $this->subtotal + $this->tax;
    }

    #[PostDeserialize]
    public function onLoaded(): void
    {
        $this->total = $this->subtotal + $this->tax;
    }
}
```

---

Value Transforms
----------------

[](#value-transforms)

```
use MonkeysLegion\Serializer\Attribute\Transform;

class Contact
{
    #[Transform(serialize: 'strtolower', deserialize: 'strtolower')]
    public string $email;

    #[Transform(serialize: 'trim')]
    public string $name;
}
```

---

Custom Accessors
----------------

[](#custom-accessors)

```
use MonkeysLegion\Serializer\Attribute\Accessor;

class User
{
    #[Accessor(getter: 'getEmail', setter: 'setEmail')]
    private string $email;

    public function getEmail(): string { return $this->email; }
    public function setEmail(string $v): void { $this->email = strtolower($v); }
}
```

---

Per-Property Max Depth
----------------------

[](#per-property-max-depth)

```
use MonkeysLegion\Serializer\Attribute\MaxDepth;

class User
{
    public int $id;

    #[MaxDepth(1)]
    public ?Company $company; // Only serialized at top-level, not nested
}
```

---

Exception Handling
------------------

[](#exception-handling)

```
use MonkeysLegion\Serializer\Exception\{
    SerializerException,
    SerializationException,
    DeserializationException,
};

try {
    $user = $serializer->fromJson($invalidJson, User::class);
} catch (DeserializationException $e) {
    // Handle deserialization-specific errors
} catch (SerializerException $e) {
    // Catch all serializer errors
}
```

Serialization Groups
--------------------

[](#serialization-groups)

```
use MonkeysLegion\Serializer\DTO\SerializationContext;

// Only include 'api' group fields
$json = $serializer->serialize($user, 'json', new SerializationContext(
    groups: ['api'],
));
```

---

Naming Strategies
-----------------

[](#naming-strategies)

```
use MonkeysLegion\Serializer\Enum\NamingStrategy;

// camelCase output
$serializer = Serializer::create(NamingStrategy::CamelCase);

// snake_case output (default)
$serializer = Serializer::create(NamingStrategy::SnakeCase);

// kebab-case output
$serializer = Serializer::create(NamingStrategy::KebabCase);
```

---

XML Support
-----------

[](#xml-support)

```
use MonkeysLegion\Serializer\Attribute\{XmlRoot, XmlElement, XmlAttribute};

#[XmlRoot('order')]
class Order
{
    #[XmlAttribute]
    public int $id;

    #[XmlElement('line_item')]
    public array $items;
}

$xml = $serializer->toXml($order);
```

---

Backed Enums
------------

[](#backed-enums)

```
enum Status: string
{
    case Active   = 'active';
    case Inactive = 'inactive';
}

class Account
{
    public function __construct(
        public readonly int $id,
        public readonly Status $status,
    ) {}
}

// Enums serialize to their scalar value automatically
$json = $serializer->toJson(new Account(1, Status::Active));
// {"id":1,"status":"active"}

// And deserialize back
$account = $serializer->fromJson($json, Account::class);
$account->status === Status::Active; // true
```

---

Polymorphic Discriminator
-------------------------

[](#polymorphic-discriminator)

```
use MonkeysLegion\Serializer\Attribute\Discriminator;

#[Discriminator(field: 'type', map: [
    'cat' => Cat::class,
    'dog' => Dog::class,
])]
abstract class Animal
{
    public string $name;
}

class Cat extends Animal { public int $lives = 9; }
class Dog extends Animal { public string $breed; }

$json = '{"type":"cat","name":"Whiskers","lives":7}';
$animal = $serializer->fromJson($json, Animal::class);
// Returns Cat instance
```

---

Collections
-----------

[](#collections)

```
use MonkeysLegion\Serializer\Attribute\Type;

class Order
{
    public int $id;

    #[Type('list')]
    public array $items = [];
}

// Serialize/deserialize lists
$json = $serializer->serializeList($orders);
$orders = $serializer->deserializeList($json, Order::class);
```

---

Context Options
---------------

[](#context-options)

### SerializationContext

[](#serializationcontext)

OptionTypeDefaultDescription`groups``list``[]`Active groups (empty = all)`maxDepth``int``10`Max object nesting depth`dateFormat``string`ISO 8601Default date format`serializeNulls``bool``false`Include null values### DeserializationContext

[](#deserializationcontext)

OptionTypeDefaultDescription`groups``list``[]`Active groups (empty = all)`ignoreUnknown``bool``true`Skip unknown keys`dateFormat``string`ISO 8601Expected date format`strictTypes``bool``false`Enforce strict coercion---

DI Integration
--------------

[](#di-integration)

```
use MonkeysLegion\Serializer\Provider\SerializerProvider;

// Register in your container
$serializer = SerializerProvider::register($config['serializer'] ?? []);
```

---

Configuration (`config/serializer.mlc`)
---------------------------------------

[](#configuration-configserializermlc)

```
php ml serializer:install
```

```
serializer {
    default_format  = json
    naming_strategy = snake_case
    serialize_nulls = false
    date_format     = "Y-m-d\TH:i:sP"
    max_depth       = 10

    json {
        pretty_print = false
    }

    xml {
        version  = "1.0"
        encoding = "UTF-8"
        root_tag = "root"
    }
}

```

---

License
-------

[](#license)

MIT © 2026 MonkeysCloud Team

###  Health Score

41

—

FairBetter than 87% of packages

Maintenance95

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity51

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

24d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/2913369?v=4)[Jorge Peraza](/maintainers/yorchperaza)[@yorchperaza](https://github.com/yorchperaza)

---

Top Contributors

[![yorchperaza](https://avatars.githubusercontent.com/u/2913369?v=4)](https://github.com/yorchperaza "yorchperaza (1 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/monkeyscloud-monkeyslegion-serializer/health.svg)

```
[![Health](https://phpackages.com/badges/monkeyscloud-monkeyslegion-serializer/health.svg)](https://phpackages.com/packages/monkeyscloud-monkeyslegion-serializer)
```

###  Alternatives

[mck89/peast

Peast is PHP library that generates AST for JavaScript code

19037.7M41](/packages/mck89-peast)[karriere/json-decoder

JsonDecoder implementation that allows you to convert your JSON data into PHP class objects

141439.4k12](/packages/karriere-json-decoder)[sauladam/shipment-tracker

Parses tracking information for several carriers, like UPS, USPS, DHL and GLS by simply scraping the data. No need for any kind of API access.

9642.0k](/packages/sauladam-shipment-tracker)[jstewmc/rtf

Read and write Rich Text Format (RTF) documents with PHP

45143.1k6](/packages/jstewmc-rtf)[json-mapper/laravel-package

The JsonMapper package for Laravel

25188.9k3](/packages/json-mapper-laravel-package)[jamesmoss/toml

A parser for TOML implemented in PHP.

3231.7k15](/packages/jamesmoss-toml)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
