SerializeReference

Applies to: properties

Namespace:

namespace Lenga\Engine\Attributes;

Marks a property for managed-reference serialization. Unlike SerializeField, which serializes by value, SerializeReference preserves the concrete type of the object when saving and loading, making it suitable for polymorphic fields (interfaces, abstract classes, or class hierarchies).

Example

use Lenga\Engine\Attributes\SerializeReference;
use Lenga\Engine\Core\Behaviour;

interface IWeapon
{
    public function attack(): void;
}

class Sword implements IWeapon
{
    public float $damage = 25.0;

    public function attack(): void { /* swing */ }
}

class Player extends Behaviour
{
    // The actual concrete type (Sword, Bow, etc.) is preserved on save/load
    #[SerializeReference]
    public ?IWeapon $equippedWeapon = null;

    public function update(): void
    {
        $this->equippedWeapon?->attack();
    }
}