lukasz93p / object-serializer
这是一个允许使用 JSON 格式轻松序列化和反序列化 PHP 对象的包,不需要使用设置器或公共属性。
1.0
2019-11-16 13:37 UTC
Requires
- php: ^7.3
- ext-json: *
- doctrine/annotations: ^1.8
- jms/serializer: ^3.3
Requires (Dev)
- phpunit/phpunit: ^8.4
This package is auto-updated.
Last update: 2024-09-17 00:08:02 UTC
README
当前实现使用 jms/serializer: https://packagist.org.cn/packages/jms/serializer
因此,jms/serializer 的注解对于此包是必需的 - 您可以在这里了解它们: http://jmsyst.com/libs/serializer/master/reference/annotations
为什么要使用此包?
- 它提供了一个非常易于使用的工具,可以将 PHP 对象转换为 JSON 格式,反之亦然。
- 不需要公共属性、构造函数或设置器,因此转换后的对象可以利用完全封装。
- 不使用原生 PHP 序列化,因此序列化对象不受语言依赖。
- 支持非常丰富的属性类型范围(包括类实例)。
如何使用?
1. 您想要序列化的类必须实现
<?php namespace Lukasz93P\objectSerializer; interface SerializableObject { /** * Unique identifier(per class, not per instance) used to identify serialized object class * Event if You change class name/namespace after object serialization it still can be deserialized properly **/ public function classIdentificationKey(): string; }
2. 向实现 jms/serializer 中的 SerializableObjects 类添加注解,就像 jms/serializer 文档中描述的那样: http://jmsyst.com/libs/serializer/master/reference/annotations.
3. 序列化类实例
$serializer = ObjectSerializerFactory::create([]); $objectSerializedToJson = $serializer->serialize($serializableObjectInstance);
4. 反序列化类实例
$serializer = ObjectSerializerFactory::create([TestSerializableClass::IDENTIFICATION_KEY => TestSerializableClass::class]); $testSerializableClassInstace = $serializer->deserialize($serializedTestSerializableClassInstance);
5. ObjectSerializer 的实例化:您应该通过 ObjectSerializerFactory::create 方法来完成此操作。该方法接收一个关联数组,用作 SerializableObject::classIdentificationKey 的结果和每个实现 SerializableObject 的类的完全限定名称之间的映射。
示例
<?php namespace tests; use JMS\Serializer\Annotation as Serializer; use Lukasz93P\objectSerializer\ObjectSerializerFactory; use Lukasz93P\objectSerializer\SerializableObject; use PHPUnit\Framework\TestCase; class TestSerializableClass implements SerializableObject { public const IDENTIFICATION_KEY = 'test'; /** * @var string * @Serializer\SerializedName("testStringField") * @Serializer\Type("string") */ private $testStringField; /** * @var int * @Serializer\SerializedName("testNumericField") * @Serializer\Type("int") */ private $testNumericField; public function __construct(string $testStringField, int $testNumericField) { $this->testStringField = $testStringField; $this->testNumericField = $testNumericField; } public function classIdentificationKey(): string { return self::IDENTIFICATION_KEY; } public function getTestStringField(): string { return $this->testStringField; } public function getTestNumericField(): int { return $this->testNumericField; } } class ObjectSerializerTest extends TestCase { private $objectSerializer; protected function setUp(): void { parent::setUp(); $this->objectSerializer = ObjectSerializerFactory::create([TestSerializableClass::IDENTIFICATION_KEY => TestSerializableClass::class]); } public function testShouldSerializeAndDeserializeSerializableObjectInstance(): void { $serializableObjectInstance = new TestSerializableClass('test', 1); $serializedObject = $this->objectSerializer->serialize($serializableObjectInstance); $deserializedObject = $this->objectSerializer->deserialize($serializedObject); $this->assertInstanceOf(TestSerializableClass::class, $deserializedObject); } public function testShouldSerializeAndDeserializeSerializableObjectInstanceWithClassFieldsRegardlessOfThoseFieldsVisibilityAndWithoutAvailableSetters( ): void { $testStringValue = 'testStringValue'; $testNumericValue = 4235; $serializableObjectInstance = new TestSerializableClass($testStringValue, $testNumericValue); $serializedObject = $this->objectSerializer->serialize($serializableObjectInstance); /** @var TestSerializableClass $deserializedObject */ $deserializedObject = $this->objectSerializer->deserialize($serializedObject); $this->assertEquals($testStringValue, $deserializedObject->getTestStringField()); $this->assertEquals($testNumericValue, $deserializedObject->getTestNumericField()); } }