如何读取和解释PHP中任何对象的序列化输出?

如何读取和解释PHP中任何对象的序列化输出?,php,object,serialization,Php,Object,Serialization,鉴于此代码: $array = array('1' => 'one', '2' => 'two', '3' => 'three'); $arrayObject = new ArrayObject($array); $iterator = $arrayObject->getIterator(); echo serialize($iterator); 我把这个字符串作为一个soutput: C:13:"ArrayI

鉴于此代码:

$array = array('1' => 'one',
               '2' => 'two',
               '3' => 'three');
$arrayObject = new ArrayObject($array);
$iterator = $arrayObject->getIterator();
echo serialize($iterator);
我把这个字符串作为一个soutput:

C:13:"ArrayIterator":111:{x:i:16777216;C:11:"ArrayObject":65:{x:i:0;a:3:{i:1;s:3:"one";i:2;s:3:"two";i:3;s:5:"three";};m:a:0:{}};m:a:0:{}}
现在,假设这是我从输出中理解的:

  • C:13:“ArrayIterator”->名称长度为13个字符的类
  • i:16777216;->一个int(i),其值为16777216
  • a:3:{i:1;s:3:“一”;i:2;s:3:“二”;i:3;s:5:“三”}->一个由三个元素组成的数组,i:1是第一个num键,s:3:“一”是该键的值,依此类推
  • a:0{}->一个空数组
我的问题是:

  • 序列化中这些粗体/突出显示的部分是什么:
C:13:“阵列对象”:111:{x:i:16777216;C:11:“阵列对象”:65:{x:i:0;a:3:{i:1;s:3:'1;i:2;s:3:'2;i:3;i:3;s:5:'3;};m:a:0:{/strong>

  • “ArrayIterator”和“ArrayObject”后面的“111”和“65”分别是什么,它们的目的是什么

  • “x:i:16777216”和“x:i:0”的含义是什么?我的意思是,我知道i分别指int、16777216和0,但是x又是什么意思呢?这是干什么用的

  • 在ArrayObject和ArrayInterator中,那些前缀为m(m:a:0:{})的空数组是什么?m的目的是什么

是否有一个完整的参考资料或比PHP手册更深入一点的内容,因为我在PHP手册页上没有找到关于此类对象序列化的信息或示例


谢谢大家的关注

幸运的是,我可以在源代码的一点中找到那些x:和m:以及字符串append。我可能错了,但是“x:”看起来是相对于数组中使用的最后一个索引的(因此在本例中,serialize甚至保存了类的状态)“m:”是用成员注释的,我不知道它可能是什么

您可以通过此链接进一步学习:


什么版本的php?我在运行你的代码片段时得到了完全不同的输出。我得到:O:11:“ArrayObject”:3:{i:1;s:3:“一”;i:2;s:3:“二”;i:3;s:5:“三”}在序列化变量之前,先对它进行一个var_转储,看看里面有什么。这样你才能更好地理解它。你没有扩展这个类,你只是运行那个片段,对吗?可能重复我写了我能找到的:)至少如果你真的有兴趣找到一个起点的话。将数组移动到某个位置并再次序列化,检查“i”部分是否更改。我没有PHP5.6,我的序列化输出中没有这些内容。我有我在第一条评论中写的东西。
1676 /* {{{ proto string ArrayObject::serialize()
1677   Serialize the object */
1678 SPL_METHOD(Array, serialize)
1679 {
1680    zval *object = getThis();
1681    spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
1682    HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
1683    zval members, *pmembers;
1684    php_serialize_data_t var_hash;
1685    smart_str buf = {0};
1686    zval *flags;
1687
1688    if (zend_parse_parameters_none() == FAILURE) {
1689        return;
1690    }
1691
1692    if (!aht) {
1693        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array");
1694        return;
1695    }
1696
1697    PHP_VAR_SERIALIZE_INIT(var_hash);
1698
1699    MAKE_STD_ZVAL(flags);
1700    ZVAL_LONG(flags, (intern->ar_flags & SPL_ARRAY_CLONE_MASK));
1701
1702    /* storage */
1703    smart_str_appendl(&buf, "x:", 2);
1704    php_var_serialize(&buf, &flags, &var_hash TSRMLS_CC);
1705    zval_ptr_dtor(&flags);
1706
1707    if (!(intern->ar_flags & SPL_ARRAY_IS_SELF)) {
1708        php_var_serialize(&buf, &intern->array, &var_hash TSRMLS_CC);
1709        smart_str_appendc(&buf, ';');
1710    }
1711
1712    /* members */
1713    smart_str_appendl(&buf, "m:", 2);
1714    INIT_PZVAL(&members);
1715    if (!intern->std.properties) {
1716        rebuild_object_properties(&intern->std);
1717    }
1718    Z_ARRVAL(members) = intern->std.properties;
1719    Z_TYPE(members) = IS_ARRAY;
1720    pmembers = &members;
1721    php_var_serialize(&buf, &pmembers, &var_hash TSRMLS_CC); /* finishes the string */
1722
1723    /* done */
1724    PHP_VAR_SERIALIZE_DESTROY(var_hash);
1725
1726    if (buf.c) {
1727        RETURN_STRINGL(buf.c, buf.len, 0);
1728    }
1729
1730    RETURN_NULL();
1731 } /* }}} */