eremin / serende

PHP serialize() 编码器 & 解码器

0.0.1 2020-02-18 23:16 UTC

This package is auto-updated.

Last update: 2024-09-23 19:20:22 UTC


README

PHP serialize() 编码器 & 解码器

内容

安装

例如,使用 composer

composer req eremin/serende

使用

可以通过工厂类创建解码器或编码器的实例

use Eremin\SerEnDe\Factory;
$decoder = Factory::createDecoder();
$encoder = Factory::createEncoder();

解码器

如果您的序列化数据是字符串,请调用 decodeFromString() 方法;如果是 PHP 流,请调用 decodeFromStream() 方法。

$test = [
    1 => 'a',
    'b' => 2,
    true,
    'refTarget' => 'REF_TARGET',
];
$test['ref'] = &$test['refTarget'];
$serialized = \serialize($test);
/// string(86) "a:5:{i:1;s:1:"a";s:1:"b";i:2;i:2;b:1;s:9:"refTarget";s:10:"REF_TARGET";s:3:"ref";R:5;}"
$parsed = $decoder->decodeFromString($serialized);
// object(Eremin\SerEnDe\Types\ArrayType)#25 (2) {
//   ["elements":"Eremin\SerEnDe\Types\ArrayType":private]=>
//   array(5) {
//     [0]=>
//     object(Eremin\SerEnDe\Types\ArrayType\Element)#28 (2) {
//       ["key":"Eremin\SerEnDe\Types\ArrayType\Element":private]=>
//       object(Eremin\SerEnDe\Types\IntType)#26 (1) {
//         ["rawContent"]=>
//         string(1) "1"
//       }
//       ["value":"Eremin\SerEnDe\Types\ArrayType\Element":private]=>
//       object(Eremin\SerEnDe\Types\StringType)#27 (1) {
//         ["rawContent"]=>
//         string(1) "a"
//       }
//     }
//     [1]=>
//     object(Eremin\SerEnDe\Types\ArrayType\Element)#31 (2) {
//       ["key":"Eremin\SerEnDe\Types\ArrayType\Element":private]=>
//       object(Eremin\SerEnDe\Types\StringType)#29 (1) {
//         ["rawContent"]=>
//         string(1) "b"
//       }
//       ["value":"Eremin\SerEnDe\Types\ArrayType\Element":private]=>
//       object(Eremin\SerEnDe\Types\IntType)#30 (1) {
//         ["rawContent"]=>
//         string(1) "2"
//       }
//     }
//     [2]=>
//     object(Eremin\SerEnDe\Types\ArrayType\Element)#34 (2) {
//       ["key":"Eremin\SerEnDe\Types\ArrayType\Element":private]=>
//       object(Eremin\SerEnDe\Types\IntType)#32 (1) {
//         ["rawContent"]=>
//         string(1) "2"
//       }
//       ["value":"Eremin\SerEnDe\Types\ArrayType\Element":private]=>
//       object(Eremin\SerEnDe\Types\BoolType)#33 (1) {
//         ["rawContent"]=>
//         string(1) "1"
//       }
//     }
//     [3]=>
//     object(Eremin\SerEnDe\Types\ArrayType\Element)#37 (2) {
//       ["key":"Eremin\SerEnDe\Types\ArrayType\Element":private]=>
//       object(Eremin\SerEnDe\Types\StringType)#35 (1) {
//         ["rawContent"]=>
//         string(9) "refTarget"
//       }
//       ["value":"Eremin\SerEnDe\Types\ArrayType\Element":private]=>
//       object(Eremin\SerEnDe\Types\StringType)#36 (1) {
//         ["rawContent"]=>
//         string(10) "REF_TARGET"
//       }
//     }
//     [4]=>
//     object(Eremin\SerEnDe\Types\ArrayType\Element)#40 (2) {
//       ["key":"Eremin\SerEnDe\Types\ArrayType\Element":private]=>
//       object(Eremin\SerEnDe\Types\StringType)#38 (1) {
//         ["rawContent"]=>
//         string(3) "ref"
//       }
//       ["value":"Eremin\SerEnDe\Types\ArrayType\Element":private]=>
//       object(Eremin\SerEnDe\Types\ReferenceType)#39 (2) {
//         ["referencedType":"Eremin\SerEnDe\Types\ReferenceType":private]=>
//         object(Eremin\SerEnDe\Types\StringType)#36 (1) {
//           ["rawContent"]=>
//           string(10) "REF_TARGET"
//         }
//         ["rawContent"]=>
//         string(1) "5"
//       }
//     }
//   }
//   ["rawContent"]=>
//   NULL
// } 

编码器

编码器只有一个方法 encode()

$serialized = $encoder->encode($parsed);
// a:5:{i:1;s:1:"a";s:1:"b";i:2;i:2;b:1;s:9:"refTarget";s:10:"REF_TARGET";s:3:"ref";R:5;}
$data = unserialize($serialized);
// array(5) {
//   [1]=>
//   string(1) "a"
//   ["b"]=>
//   int(2)
//   [2]=>
//   bool(true)
//   ["refTarget"]=>
//   &string(10) "REF_TARGET"
//   ["ref"]=>
//   &string(10) "REF_TARGET"
// }

类型

所有类型都有 $rawContent 属性,但这个属性仅在 StringTypeSerializableObjectType 中直接使用

NullType

它表示 NULL,没有内容和方法。

$type = new \Eremin\SerEnDe\Types\NullType();
$encoder->encode($type);
// N;

BoolType

它表示布尔值,有两个方法。

$type = new \Eremin\SerEnDe\Types\BoolType();
$type->setValue(true);
$encoder->encode($type);
// b:1;
$type->getValue();
// bool(true)

IntType

它表示整数,有两个方法。

$type = new \Eremin\SerEnDe\Types\IntType();
$type->setValue(-555);
$encoder->encode($type);
// i:-555;
$type->getValue();
// int(-555)

FloatType

它表示浮点数,有两个方法。

$type = new \Eremin\SerEnDe\Types\FloatType();
$type->setValue(-5e-5);
$encoder->encode($type);
// d:-5.0E-5;;
$type->getValue();
// float(-5.0E-5)

StringType

它表示字符串,正如上面所述,字符串的内容将通过 $rawContent 属性访问。

$type = new \Eremin\SerEnDe\Types\StringType();
$type->rawContent = "hello \"\\ world!";
$encoder->encode($type);
// s:15:"hello "\ world!";

SerializableObjectType

它表示实现了 \Serializable 接口的对象(PHP 文档)。其内容将通过该接口的方法生成,并通过 $rawContent 属性访问。

class A implements Serializable {
    public $foo;
    public function serialize()
    {
        return \json_encode($this);
    }

    public function unserialize($serialized)
    {
        return \json_decode($serialized, true);
    }
}
class B {}
$type = new \Eremin\SerEnDe\Types\SerializableObjectType();
$type->rawContent = \json_encode(['foo' => 'bar']);
$encoder->encode($type);
// C:1:"A":13:{{"foo":"bar"}}
$type->className = 'B';
unserialize($encoder->encode($type));
// Warning: Class B has no unserializer
// object(B)#23 (0) {
// }

ArrayHandler

即将推出...

ObjectHandler

即将推出...