vuryss/serializer

一个快速、可扩展的PHP数据结构序列化器和反序列化器


README

Tests codecov Codacy Badge CodeFactor GitHub Release GitHub License

序列化和反序列化复杂数据结构到和从json。灵感来源于Symfony的Serializer组件、Serde和其他。

Symfony序列化器非常灵活,但也很慢。这个库试图尽可能快。

支持具有完全类型属性的现代PHP项目。没有类型的旧代码库将无法工作。

安装

composer require vuryss/serializer

特性

序列化

  • 如果属性是公开的或具有getter方法,则将其序列化。
$person = new Person();
$person->firstName = 'Maria';
$person->lastName = 'Valentina';
$person->age = 36;
$person->isStudent = false;

$serializer = new Serializer();
$json = $serializer->serialize($person);
// {"firstName":"Maria","lastName":"Valentina","age":36,"isStudent":false}

反序列化

  • 如果属性是公开的、可以在公开构造函数中实例化或在具有setter方法,则将其反序列化。
$json = '{"firstName":"Maria","lastName":"Valentina","age":36,"isStudent":false}';
$serializer = new Serializer();
$person = $serializer->deserialize($json, Person::class);

缓存 - 可选,但强烈推荐,否则库会变慢

支持PSR-6 CacheItemPoolInterface: https://www.php-fig.org/psr/psr-6/#cacheitempoolinterface

无需将内存缓存与外部缓存链式连接,库会为您完成。缓存将针对每个使用的类(在序列化或反序列化中使用)调用一次,然后将在内存中缓存直到脚本结束。

$pst6cache = new CacheItemPool(); // Some PSR-6 cache implementation
$serializer = new Serializer(
    metadataExtractor: new CachedMetadataExtractor(
        new MetadataExtractor(),
        $pst6cache,
    ),
);

自定义对象属性序列化名称

class SomeClass
{
    #[SerializerContext(name: 'changedPropertyName')]
    public string $someProperty;
}

序列化组

class SomeClass
{
    #[SerializerContext(groups: ['group1'])]
    public string $property1;

    // Has implicit group 'default'
    public string $property2;
}

    
$serializer = new Serializer();
$object = new SomeClass();
$object->property1 = 'value1';
$object->property2 = 'value2';
$serializer->serialize($object, attributes: [SerializerInterface::ATTRIBUTE_GROUPS => ['group1']]); // {"property1":"value1"}

反序列化组

class SomeClass
{
    #[SerializerContext(groups: ['group1'])]
    public string $property1;

    // Has implicit group 'default'
    public string $property2;
}

    
$serializer = new Serializer();
$data = '{"property1":"value1","property2":"value2"}';
$object = $serializer->deserialize($data, SomeClass::class, attributes: [SerializerInterface::ATTRIBUTE_GROUPS => ['group1']]);
isset($object->property1); // true
isset($object->property2); // false

自定义日期格式

在序列化时,将始终遵守格式。在反序列化时,将使用格式解析日期。然而,在默认情况下,如果日期不是提供的格式,它将按原样解析,前提是DateTime构造函数可以解析它。

按属性

class SomeClass
{
    #[SerializerContext(attributes: [SerializerInterface::ATTRIBUTE_DATETIME_FORMAT => 'Y-m-d'])]
    public DateTime $someDate;
}

或全局

$serializer = new Serializer(
    attributes: [
        SerializerInterface::ATTRIBUTE_DATETIME_FORMAT => \DateTimeInterface::RFC2822,
    ]
);

强制日期格式

如果在反序列化期间需要严格的数据时间格式,则可以使用SerializerInterface::ATTRIBUTE_DATETIME_FORMAT_STRICT属性

按属性

class SomeClass
{
    #[SerializerContext(attributes: [
        SerializerInterface::ATTRIBUTE_DATETIME_FORMAT => 'Y-m-d',
        SerializerInterface::ATTRIBUTE_DATETIME_FORMAT_STRICT => true
    ])]
    public DateTime $someDate;
}

或全局

$serializer = new Serializer(
    attributes: [
        SerializerInterface::ATTRIBUTE_DATETIME_FORMAT => 'Y-m-d',
        SerializerInterface::ATTRIBUTE_DATETIME_FORMAT_STRICT => true
    ]
);

忽略属性

这些属性在序列化期间将不包括在序列化值中,并且在反序列化期间不会用提供的值填充。

class SomeClass
{
    #[SerializerContext(ignore: true)]
    public string $someProperty;
}

处理NULL值

  • 默认情况下,NULL值包含在序列化值中。

要禁用此功能,可以使用SerializerInterface::ATTRIBUTE_SKIP_NULL_VALUES属性

按属性

class SomeClass
{
    #[SerializerContext(attributes: [SerializerInterface::ATTRIBUTE_SKIP_NULL_VALUES => true])]
    public ?string $someProperty;
}

或全局

$serializer = new Serializer(
    attributes: [
        SerializerInterface::ATTRIBUTE_SKIP_NULL_VALUES => true,
    ]
);

支持可序列化的json对象

如果对象实现了JsonSerializable接口,则将调用jsonSerialize方法,并将结果序列化。

本地构建、运行和测试

要进入准备好的容器环境

docker-compose up -d
docker-compose exec library bash

安装包依赖项

composer install -o

运行测试

composer test

本地HTML覆盖率

XDEBUG_MODE=coverage vendor/bin/pest --coverage --coverage-html=coverage