0

我在数据库中有这个字符串。我需要用 php 反序列化它。问题是它返回了一些“__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)
    }
  }
}

我曾尝试将 MongoId 类别名为 ObjectId。不工作。我试图创建新类 MongoId 来扩展 ObjectId。我不允许,因为 ObjectId 是最终类。

我试图用 C:8:"ObjectID" 替换 C:7:"MongoId"。

结果仍然相同:__PHP_Incomplete_Class_Name

也许一种可能性是像数组而不是对象一样返回结果?

4

2 回答 2

0

根据您的需要,仅定义类可能更容易。然后unserialize就好了。这将反序列化由inSerializable表示的实现的对象的值,如在未序列化的对象中一样:CC:7:"MongoId"id

class MongoId implements Serializable { 
    public function unserialize($str) {
        $this->id = $str; 
    }
    public function serialize() {}
}
class MongoDate {}
于 2018-06-14T17:47:43.327 回答
0

您的方法为 MongoDate 指明了正确的方向,因为它使用正常的 O 型序列化。对于 MongoId 来说更困难,因为它有自定义的 C 类型序列化处理程序。

如果这是我的任务,我大概会这样开始:

  • 声明一个类MongoId并实现 Serializable 接口。对于unserialize函数,请尝试模仿原始函数(在 L407->L220 上可用)。

  • 对于serialize函数,找出ObjectId序列化的样子并模仿它。(可在此处获得 L187

  • 从数据库中反序列化字符串,然后再次序列化。

  • 将重新序列化的字符串中的 C:7:"MongoId" 替换为 C:21:"MongoDb\BSON\ObjectID"。您需要命名空间以及类名。

  • 再次反序列化并祈祷。

MongoId 类应该是这样的;但代码根本没有经过测试:

class MongoId implements Serializable {
  public $id;
  public function serialize() {
    return serialize(['oid' => $this->id]);
  }
  public function unserialize($str) {
    $this->id = $str;
  }
}

我希望这至少有一点帮助。

于 2018-06-14T18:20:42.840 回答