onemoreangle/php-marshaller

一个小型库,具有少量必需依赖项,用于使用可选属性或基于注解的配置序列化和反序列化PHP结构

dev-main 2023-11-30 00:29 UTC

This package is auto-updated.

Last update: 2024-09-30 01:41:20 UTC


README

tests

警告
此项目处于非常早期的开发阶段,应被视为实验性的。

这是一个小型库,具有少量必需依赖项,用于使用基于注解的可选配置序列化和反序列化PHP数据结构。

当前功能

  • JSON和YAML序列化和反序列化
  • 可选属性或基于注解的序列化/反序列化定制
  • 递归推断属性类型和可选基于注解的目标类型
  • 循环引用检测
  • 支持PHP 8属性和Doctrine注解(PHP 7.4+)

计划功能

  • 支持其他序列化格式,尤其是XML
  • 更强大的对象实例化能力
  • 用户定义的定制(反)序列化逻辑
  • 性能优化
  • 使用getter和setter进行数据提取和注入(默认情况下)

安装

对于一般使用,请使用以下命令通过composer安装库

composer require onemoreangle/php-marshaller --no-dev

开发

使用composer和开发依赖项安装库

composer require onemoreangle/php-marshaller

使用方法

使用默认设置进行简单使用

要序列化和反序列化,您可以使用任何可用的序列化提供程序,这些提供程序包含默认的读取属性/注解。例如,要使用具有默认设置的Json序列化提供程序

use OneMoreAngle\Marshaller\Api\Json;

$data = new CustomClass();
$serialized = Json::marshal($data);
$deserialized = Json::unmarshal($json, CustomClass::class);

将来将添加其他格式的序列化提供程序。

定制序列化

您可以通过创建一个SerializerBuilder并将其与选项一起提供来自定义序列化过程。通常,您会希望使用序列化提供程序的自定义设置,然后进行定制,如下所示

use OneMoreAngle\Marshaller\Api\Json;
...
$serializer = Json::getDefaultSerializerBuilder()->withMetaExtractor(...)->build();
$data = $serializer->marshal($object);

属性

您可以使用属性来自定义序列化/反序列化过程。例如,您可以使用Name属性将属性映射到不同的序列化名称,使用Aliases将替代序列化名称映射到属性,使用Omit属性从序列化中省略属性,使用OmitEmpty属性在属性为空时省略属性,并使用TargetType属性指定要反序列化的属性类型。让我们看看一个例子

use OneMoreAngle\Marshaller\Attribute\Aliases;
use OneMoreAngle\Marshaller\Attribute\Name;
use OneMoreAngle\Marshaller\Attribute\Omit;
use OneMoreAngle\Marshaller\Attribute\OmitEmpty;

class CustomClass {
    #[Name('custom_name')]
    #[Aliases(['alias1', 'alias2'])]
    #[OmitEmpty]
    public string $property;
    
    #[Omit]
    public string $property2;
}

当您按如下方式序列化上述类的实例时

use OneMoreAngle\Marshaller\Api\Json;

$data = new CustomClass();
$data->property = 'test';
$data->property2 => 'test2';
$serialized = Json::marshal($data);
echo $serialized;

输出将是

{"custom_name":"test"}

当我们使用JSON中的别名属性进行反序列化时

use OneMoreAngle\Marshaller\Api\Json;

$json = '{"alias2":"hello"}';
$deserialized = Json::unmarshal($json, CustomClass::class);
print_r($deserialized);

我们得到以下输出

CustomClass Object
(
    [property] => hello
)

要求

  • PHP >= 7.4(要使用属性,PHP 8.0或更高版本是必需的;否则,您可以使用doctrine/annotations并使用注解代替)

贡献

欢迎贡献!请随时提交pull request

许可

php-marshaller库是在MIT许可证下发布的。有关更多详细信息,请参阅LICENSE文件。