matthiasnoback/broadway-serialization

Broadway 的序列化助手

v3.0.0 2021-01-30 16:11 UTC

This package is auto-updated.

Last update: 2024-08-29 04:14:28 UTC


README

作者:Matthias Noback

事件源框架 Broadway 需要您许多对象(如领域事件,以及通常还包括视图模型)可序列化,因为它们必须以纯文本形式存储,并在以后重建。

使对象可序列化需要您编写大量相当简单的代码。尽管这些代码很简单,但您很可能会在其中犯错误。编写这些代码也有些无聊。为了减轻痛苦,这个库帮助您通过几个简单的步骤使对象可序列化。

安装

只需运行

composer require matthiasnoback/broadway-serialization

约定

这个库非常简单,因为它基于一些简单且合理的假设 只需工作即可

  1. 可序列化对象至少有一个属性。属性可以有任何作用域。
  2. 可序列化对象实现了 Broadway 的 Serializable 接口。
  3. 属性包含标量值、可序列化对象或可序列化对象的数组。

示例

use Broadway\Serializer\Serializable;
use BroadwaySerialization\Serialization\AutoSerializable;

class SerializableObject implements SerializableInterface
{
    use AutoSerializable;

    /**
     * @var string
     */
    private $foo;
    
    /**
     * @var SerializableObject
     */
    private $bar;
    
    /**
     * @var SerializableObject[]
     */
    private $bars = [];

    protected static function deserializationCallbacks()
    {
        return [
            'bar' => ['SerializableObject', 'deserialize'],
            'bars' => ['SerializableObject', 'deserialize']
        ];
    }
}

通过实现 deserializationCallbacks(),您可以定义在解序列化提供的数据时应该调用的可调用函数。对于单个值,可调用函数将调用一次;对于值的数组,可调用函数将多次调用。

设置

Serializable 特性依赖于一些设置。在调用其 deserialize() 方法之前,请确保您已正确设置 Reconstitute 服务,如下所示

use BroadwaySerialization\Reconstitution\Reconstitution;
use BroadwaySerialization\Reconstitution\ReconstituteUsingInstantiatorAndHydrator;
use Doctrine\Instantiator\Instantiator;
use BroadwaySerialization\Hydration\HydrateUsingReflection;

Reconstitution::reconstituteUsing(
    new ReconstituteUsingInstantiatorAndHydrator(
        new Instantiator(),
        new HydrateUsingReflection()
    )
);

请注意,此包附带不同的 hydrator 实现。根据您的设置和偏好,您也可以使用 HydrateUsingClosure 类。前者通常比 HydrateUsingReflection 表现更好。

性能

使用此库时,您个人的性能将显著提高。当然,运行时性能会稍差(除非您实际上正在解序列化数百万个对象,否则不会明显注意到)。