如何用PHP反序列化这些数据?

时间:2013-06-09 14:20:29

标签: php python serialization

我有这个数据集,可能是用php function serialize()

序列化的
C:8:"Poreikis":768:{a:14:{s:3:"_id";a:1:{s:2:"id";s:4:"5889";}s:5:"_data";a:12:{s:2:"id";s:4:"5889";s:11:"stokojantis";s:4:"2748";s:17:"parent_kategorija";s:1:"1";s:10:"kategorija";s:1:"3";s:11:"pavadinimas";s:6:"Komoda";s:9:"aprasymas";s:89:"blah blah";s:7:"pasiula";N;s:6:"active";s:1:"Y";s:10:"created_at";s:19:"2013-02-10 12:10:48";s:10:"updated_at";s:19:"2013-02-10 12:10:48";s:7:"creator";s:4:"1842";s:6:"editor";N;}s:7:"_values";a:0:{}s:6:"_state";i:3;s:13:"_lastModified";a:0:{}s:9:"_modified";a:0:{}s:10:"_oldValues";a:0:{}s:15:"_pendingDeletes";a:0:{}s:15:"_pendingUnlinks";a:0:{}s:20:"_serializeReferences";b:0;s:17:"_invokedSaveHooks";b:0;s:4:"_oid";i:2;s:8:"_locator";N;s:10:"_resources";a:0:{}}}

我已尝试unserialize()功能:

var_dump( unserialize($var) );

我已经知道了:

PHP Warning:  Class __PHP_Incomplete_Class has no unserializer in /root/hacked.php on line 4
object(__PHP_Incomplete_Class)#1 (1) {
  ["__PHP_Incomplete_Class_Name"]=>
  string(8) "Poreikis"
}

我也尝试过使用python:

  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 
  4 import pprint
  5 import phpserialize
  6 from path import path
  7
  8 #filename   = sys.argv[1]
  9 content     = u'_THAT_STRING_FROM_TOP'
 10
 11 unser = phpserialize.unserialize(content)
 13 print unser

得到了这个

~# python unserialize.py
Traceback (most recent call last):
  File "hacked.py", line 11, in <module>
    unser = phpserialize.unserialize(content)
  File "/usr/local/lib/python2.7/dist-packages/phpserialize.py", line 522, in loads
    object_hook, array_hook)
  File "/usr/local/lib/python2.7/dist-packages/phpserialize.py", line 512, in load
    return _unserialize()
  File "/usr/local/lib/python2.7/dist-packages/phpserialize.py", line 510, in _unserialize
    raise ValueError('unexpected opcode')

似乎该变量可能无效?好的,现在关于这些数据。

PHP中的ORM引擎名为&#34; Doctrine&#34;,并且在教义中有一个名为&#39; BaseRecycleBin.php&#39;的模型类,它实际上是在定义一个表名为&#39; _deleted_items&#39;,存储此类值。我甚至在教义中发现serialization class。这似乎根本不做任何不规则的事情。

所以主要的问题是:如何反序列化这个字符串?

如果可以回答,Doctrine是否可以从该表中恢复该数据?因为这是我的原始内涵,用于构建来自大量序列化字符串的查询,这些字符串最初来自于&#39; _deleted_items&#39;表

1 个答案:

答案 0 :(得分:2)

关于对象序列化的

PHP manual(强调我的):

  

为了能够unserialize()一个对象,需要定义该对象的类。也就是说,如果你有一个A类的对象并序列化它,你将得到一个引用A类的字符串,并包含其中包含的所有变量值。如果您希望能够在另一个文件中反序列化它,那么A类的对象 A类的定义必须首先出现在该文件中

您的序列化字符串包含Poreikis类型的对象,因此当您想要反序列化它时,首先需要提供该类型定义。

如何为此使用关联数组的示例:

$data = array(
    'key1' => 'value1',
    'key2' => 'value2',
    'key3' => 42
);
// then either serialize that
$serialized = serialize($data);
// or make it a JSON which is supported by many languages
$jsonencoded = json_encode($data);

第二个想法是,你的Poreikis似乎有一个_data字段,它已经是一个关联数组,似乎包含了你可能想要的所有重要信息。因此,您只需访问该字段并对其进行编码,而不是手动将数据传输到新阵列。