使用过时的 MongoId 和 MongoDate 对象反序列化 PHP 字符串
Unserialize PHP string with obsolete MongoId and MongoDate Objects
我在数据库中有这个字符串。
我需要用 php 反序列化它。
问题是它 return 有一些“__PHP_Incomplete_Class_Name”对象。
我知道这个字符串是用旧的 MongoDB PHP 扩展名序列化的,我尝试用较新的 MongoDB 扩展名反序列化。
所以 MongoId 和 MongoDate 已经过时了。
这是字符串:
$string = 'a:2:{i:0;a:3:{s:4:"name";s:52:"----------------------------------------------------";s:6:"amount";s:5:"53.09";s:10:"service_id";s:24:"------------------------";}i:1;a:6:{s:2:"id";C:7:"MongoId":24:{5b2276372a4ef288038b45ba}s:4:"name";s:21:"---------------------";s:4:"type";s:8:"one time";s:10:"service_id";s:20:"thisrhietingcfffffff";s:6:"amount";s:6:"139.29";s:10:"added_date";O:9:"MongoDate":2:{s:3:"sec";i:1528985143;s:4:"usec";i:917000;}}}';
当我这样做时:
$result = @unserialize($string);
var_dump($result);
结果是:
array(2) {
[0]=>
array(3) {
["name"]=>
string(52) "----------------------------------------------------"
["amount"]=>
string(5) "53.09"
["service_id"]=>
string(24) "------------------------"
}
[1]=>
array(6) {
["id"]=>
object(__PHP_Incomplete_Class)#1 (1) {
["__PHP_Incomplete_Class_Name"]=>
string(7) "MongoId"
}
["name"]=>
string(21) "---------------------"
["type"]=>
string(8) "one time"
["service_id"]=>
string(20) "thisrhietingcfffffff"
["amount"]=>
string(6) "139.29"
["added_date"]=>
object(__PHP_Incomplete_Class)#2 (3) {
["__PHP_Incomplete_Class_Name"]=>
string(9) "MongoDate"
["sec"]=>
int(1528985143)
["usec"]=>
int(917000)
}
}
}
我试过class_alias MongoId 到 ObjectId。不工作。
我试图创建新的 class MongoId 来扩展 ObjectId。我不被允许,因为 ObjectId 是最终的 class.
我尝试用 C:8:"ObjectID" 替换 C:7:"MongoId"。
仍然是相同的结果:__PHP_Incomplete_Class_Name
也许 return 结果像数组而不是对象?
根据您的需要,仅定义 类 可能更容易。然后就unserialize
就好了。这将 C:7:"MongoId"
中的 C
表示的实现 Serializable
的对象的值反序列化为反序列化对象中的 id
:
class MongoId implements Serializable {
public function unserialize($str) {
$this->id = $str;
}
public function serialize() {}
}
class MongoDate {}
您的方法为 MongoDate 指明了正确的方向,因为它使用正常的 O 型序列化。对于 MongoId,它更加困难,因为它具有自定义的 C 类型序列化处理程序。
如果这是我的任务,我会大致这样开始:
声明一个classMongoId
并实现Serializable接口。对于 unserialize
函数,尝试模仿原始函数(可用 here on L407->L220)。
对于 serialize
函数,找出 ObjectId
序列化的样子并模仿它。 (可用here L187)
从数据库中反序列化字符串,然后再次序列化。
将重新序列化的字符串中的C:7:"MongoId"替换为C:21:"MongoDb\BSON\ObjectID"。您需要命名空间以及 class 名称。
再次反序列化祈祷
MongoId class 应该看起来像这样;但代码根本没有经过测试:
class MongoId implements Serializable {
public $id;
public function serialize() {
return serialize(['oid' => $this->id]);
}
public function unserialize($str) {
$this->id = $str;
}
}
我希望这至少能有所帮助。
我在数据库中有这个字符串。 我需要用 php 反序列化它。 问题是它 return 有一些“__PHP_Incomplete_Class_Name”对象。
我知道这个字符串是用旧的 MongoDB PHP 扩展名序列化的,我尝试用较新的 MongoDB 扩展名反序列化。
所以 MongoId 和 MongoDate 已经过时了。
这是字符串:
$string = 'a:2:{i:0;a:3:{s:4:"name";s:52:"----------------------------------------------------";s:6:"amount";s:5:"53.09";s:10:"service_id";s:24:"------------------------";}i:1;a:6:{s:2:"id";C:7:"MongoId":24:{5b2276372a4ef288038b45ba}s:4:"name";s:21:"---------------------";s:4:"type";s:8:"one time";s:10:"service_id";s:20:"thisrhietingcfffffff";s:6:"amount";s:6:"139.29";s:10:"added_date";O:9:"MongoDate":2:{s:3:"sec";i:1528985143;s:4:"usec";i:917000;}}}';
当我这样做时:
$result = @unserialize($string);
var_dump($result);
结果是:
array(2) {
[0]=>
array(3) {
["name"]=>
string(52) "----------------------------------------------------"
["amount"]=>
string(5) "53.09"
["service_id"]=>
string(24) "------------------------"
}
[1]=>
array(6) {
["id"]=>
object(__PHP_Incomplete_Class)#1 (1) {
["__PHP_Incomplete_Class_Name"]=>
string(7) "MongoId"
}
["name"]=>
string(21) "---------------------"
["type"]=>
string(8) "one time"
["service_id"]=>
string(20) "thisrhietingcfffffff"
["amount"]=>
string(6) "139.29"
["added_date"]=>
object(__PHP_Incomplete_Class)#2 (3) {
["__PHP_Incomplete_Class_Name"]=>
string(9) "MongoDate"
["sec"]=>
int(1528985143)
["usec"]=>
int(917000)
}
}
}
我试过class_alias MongoId 到 ObjectId。不工作。 我试图创建新的 class MongoId 来扩展 ObjectId。我不被允许,因为 ObjectId 是最终的 class.
我尝试用 C:8:"ObjectID" 替换 C:7:"MongoId"。
仍然是相同的结果:__PHP_Incomplete_Class_Name
也许 return 结果像数组而不是对象?
根据您的需要,仅定义 类 可能更容易。然后就unserialize
就好了。这将 C:7:"MongoId"
中的 C
表示的实现 Serializable
的对象的值反序列化为反序列化对象中的 id
:
class MongoId implements Serializable {
public function unserialize($str) {
$this->id = $str;
}
public function serialize() {}
}
class MongoDate {}
您的方法为 MongoDate 指明了正确的方向,因为它使用正常的 O 型序列化。对于 MongoId,它更加困难,因为它具有自定义的 C 类型序列化处理程序。
如果这是我的任务,我会大致这样开始:
声明一个class
MongoId
并实现Serializable接口。对于unserialize
函数,尝试模仿原始函数(可用 here on L407->L220)。对于
serialize
函数,找出ObjectId
序列化的样子并模仿它。 (可用here L187)从数据库中反序列化字符串,然后再次序列化。
将重新序列化的字符串中的C:7:"MongoId"替换为C:21:"MongoDb\BSON\ObjectID"。您需要命名空间以及 class 名称。
再次反序列化祈祷
MongoId class 应该看起来像这样;但代码根本没有经过测试:
class MongoId implements Serializable {
public $id;
public function serialize() {
return serialize(['oid' => $this->id]);
}
public function unserialize($str) {
$this->id = $str;
}
}
我希望这至少能有所帮助。