vuryss / serializer
一个快速、可扩展的PHP数据结构序列化器和反序列化器
Requires
- php: ^8.3
- phpdocumentor/reflection-docblock: ^5.4.1
- phpstan/phpdoc-parser: ^1.30
- psr/cache: ^3.0
- symfony/property-info: ^7.1.3
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.64
- mockery/mockery: ^1.6.12
- pestphp/pest: ^2.35.1
- pestphp/pest-plugin-faker: ^2.0
- symfony/serializer: ^7.1.4
- vimeo/psalm: ^5.25
- dev-master
- v1.6.0
- v1.5.0
- v1.4.2
- v1.4.1
- v1.4.0
- v1.3.0
- v1.2.0
- v1.1.1
- v1.1.0
- v1.0.0
- dev-renovate/phpstan-phpdoc-parser-1.x-lockfile
- dev-renovate/actions-checkout-4.x
- dev-renovate/github-codeql-action-3.x
- dev-renovate/pestphp-pest-3.x
- dev-renovate/vimeo-psalm-5.x-lockfile
- dev-renovate/pestphp-pest-plugin-faker-3.x
- dev-optimization-refactoring
This package is auto-updated.
Last update: 2024-09-26 09:39:00 UTC
README
序列化和反序列化复杂数据结构到和从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