Index: Zend/zend_compile.c =================================================================== RCS file: /repository/ZendEngine2/zend_compile.c,v retrieving revision 1.839 diff -u -p -r1.839 zend_compile.c --- Zend/zend_compile.c 24 Aug 2008 17:01:21 -0000 1.839 +++ Zend/zend_compile.c 24 Aug 2008 18:16:43 -0000 @@ -2888,13 +2888,16 @@ ZEND_API void zend_do_inheritance(zend_c } ce->parent = parent_ce; + /* Transfer parent custom callbacks, if any */ + if (!ce->serialize) { + ce->serialize = parent_ce->serialize; + } + if (!ce->unserialize) { + ce->unserialize = parent_ce->unserialize; + } /* Inherit interfaces */ zend_do_inherit_interfaces(ce, parent_ce TSRMLS_CC); - /* Copy serialize/unserialize callbacks */ - ce->serialize = parent_ce->serialize; - ce->unserialize = parent_ce->unserialize; - /* Inherit properties */ zend_hash_merge(&ce->default_properties, &parent_ce->default_properties, (void (*)(void *)) zval_add_ref, NULL, sizeof(zval *), 0); if (parent_ce->type != ce->type) { Index: Zend/zend_interfaces.c =================================================================== RCS file: /repository/ZendEngine2/zend_interfaces.c,v retrieving revision 1.69 diff -u -p -r1.69 zend_interfaces.c --- Zend/zend_interfaces.c 24 Aug 2008 17:01:22 -0000 1.69 +++ Zend/zend_interfaces.c 24 Aug 2008 18:16:43 -0000 @@ -474,13 +474,17 @@ ZEND_API int zend_user_unserialize(zval /* {{{ zend_implement_serializable */ static int zend_implement_serializable(zend_class_entry *interface, zend_class_entry *class_type TSRMLS_DC) { - if ((class_type->serialize && class_type->serialize != zend_user_serialize) - || (class_type->unserialize && class_type->unserialize != zend_user_unserialize) - ) { + if (class_type->parent + && (class_type->parent->serialize || class_type->parent->unserialize) + && !instanceof_function_ex(class_type->parent, zend_ce_serializable, 1 TSRMLS_CC)) { return FAILURE; } - class_type->serialize = zend_user_serialize; - class_type->unserialize = zend_user_unserialize; + if (!class_type->serialize) { + class_type->serialize = zend_user_serialize; + } + if (!class_type->unserialize) { + class_type->unserialize = zend_user_unserialize; + } return SUCCESS; } /* }}}*/