Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:15168 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 21981 invoked by uid 1010); 23 Feb 2005 12:02:50 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 21961 invoked from network); 23 Feb 2005 12:02:50 -0000 Received: from unknown (HELO bea.com) (127.0.0.1) by localhost with SMTP; 23 Feb 2005 12:02:50 -0000 X-Host-Fingerprint: 80.74.107.235 mail.zend.com Linux 2.5 (sometimes 2.4) (4) Received: from ([80.74.107.235:47787] helo=mail.zend.com) by pb1.pair.com (ecelerity HEAD r(5097)) with SMTP id 19/F9-08154-8E07C124 for ; Wed, 23 Feb 2005 07:02:49 -0500 Received: (qmail 20370 invoked from network); 23 Feb 2005 12:02:45 -0000 Received: from shire.zend.office (10.1.2.160) by internal.zend.office with SMTP; 23 Feb 2005 12:02:45 -0000 Date: Wed, 23 Feb 2005 14:02:45 +0200 (IST) X-X-Sender: frodo@shire.zend.office To: PHP Development Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="17473538-447763352-1109160165=:32475" Subject: Object custom serializing infrastructure From: stas@zend.com (Stanislav Malyshev) --17473538-447763352-1109160165=:32475 Content-Type: TEXT/PLAIN; charset=US-ASCII I have added the callbacks to class_entry structure and patches to serialization mechanism to allow custom object serialization/unserialization inside the PHP serialize mechanism. Purpose: -------- Define possibility for custom serialization and userialization of PHP5 objects, which would allow users to run custom code when objects are serialized and unserialized. Implementation: --------------- Define 2 callbacks for zend_class_entry, as follows: int (*serialize)(zval *object, unsigned char **buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC); Serializes object data into the buffer. Should serialize only object "internals", not class name. zend_serialize_data is the variables hash that var.c uses to track references. If you want to use it, consult var.c and use it the same way. int (*unserialize)(zval **object, const unsigned char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC); creates new zval according to the serialized data in buf, buf_len limits data length. Returns SUCCESS if object created correctly, FAILURE if it failed. Data include only the object data, not class name, etc. zend_unserialize_data is the variables hash that var_unserialize.re uses to track references. If you want to use it, consult var.c and use it the same way. By default, these callbacks are NULL, meaning the standard mechanism is used. Format ------ New serialization is using letter 'C' to designate custom serialization data. Example ------- Attached in the example patch for SimpleXML that demonstrates the concept by using callbacks to serialize SimpleXML object's data as XML and then restoring it to the object back. This should allow, for example, to seamlessly put SimpleXML object to a session data. -- Stanislav Malyshev, Zend Products Engineer stas@zend.com http://www.zend.com/ +972-3-6139665 ext.115 --17473538-447763352-1109160165=:32475 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="serialize.xml.diff" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="serialize.xml.diff" SW5kZXg6IHNpbXBsZXhtbC5jDQo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpS Q1MgZmlsZTogL3JlcG9zaXRvcnkvcGhwLXNyYy9leHQvc2ltcGxleG1sL3Np bXBsZXhtbC5jLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS4xNDcNCmRpZmYg LXUgLWIgLXIxLjE0NyBzaW1wbGV4bWwuYw0KLS0tIHNpbXBsZXhtbC5jCTUg RGVjIDIwMDQgMTI6MDI6MzUgLTAwMDAJMS4xNDcNCisrKyBzaW1wbGV4bWwu YwkyMiBGZWIgMjAwNSAxMzoyNzo1OSAtMDAwMA0KQEAgLTE2ODEsNiArMTY4 MSw3MSBAQA0KIAl7TlVMTCwgTlVMTCwgTlVMTH0NCiB9Ow0KIA0KK2ludCBz aW1wbGV4bWxfc2VyaWFsaXplKHp2YWwgKm9iamVjdCwgdW5zaWduZWQgY2hh ciAqKmJ1ZmZlciwgemVuZF91aW50ICpidWZfbGVuLCB6ZW5kX3NlcmlhbGl6 ZV9kYXRhICpkYXRhIFRTUk1MU19EQykNCit7DQorCXBocF9zeGVfb2JqZWN0 ICAgICAqc3hlOw0KKwl4bWxOb2RlUHRyICAgICAgICAgIG5vZGU7DQorCXht bE91dHB1dEJ1ZmZlclB0ciAgb3V0YnVmOw0KKwl4bWxDaGFyICAgICAgICAg ICAgKnN0cnZhbDsNCisJaW50ICAgICAgICAgICAgICAgICBzdHJ2YWxfbGVu Ow0KKw0KKwlzeGUgPSBwaHBfc3hlX2ZldGNoX29iamVjdChvYmplY3QgVFNS TUxTX0NDKTsNCisJR0VUX05PREUoc3hlLCBub2RlKTsNCisJbm9kZSA9IHBo cF9zeGVfZ2V0X2ZpcnN0X25vZGUoc3hlLCBub2RlIFRTUk1MU19DQyk7DQor DQorCWlmIChub2RlKSB7DQorCQlpZiAoWE1MX0RPQ1VNRU5UX05PREUgPT0g bm9kZS0+cGFyZW50LT50eXBlKSB7DQorCQkJeG1sRG9jRHVtcE1lbW9yeSgo eG1sRG9jUHRyKSBzeGUtPmRvY3VtZW50LT5wdHIsICZzdHJ2YWwsICZzdHJ2 YWxfbGVuKTsNCisJCX0gZWxzZSB7DQorCQkJLyogU2hvdWxkIHdlIGJlIHBh c3NpbmcgZW5jb2RpbmcgaW5mb3JtYXRpb24gaW5zdGVhZCBvZiBOVUxMPyAq Lw0KKwkJCW91dGJ1ZiA9IHhtbEFsbG9jT3V0cHV0QnVmZmVyKE5VTEwpOw0K Kw0KKwkJCWlmIChvdXRidWYgPT0gTlVMTCkgew0KKwkJCQlyZXR1cm4gRkFJ TFVSRTsNCisJCQl9DQorDQorCQkJeG1sTm9kZUR1bXBPdXRwdXQob3V0YnVm LCAoeG1sRG9jUHRyKSBzeGUtPmRvY3VtZW50LT5wdHIsIG5vZGUsIDAsIDEs ICgoeG1sRG9jUHRyKSBzeGUtPmRvY3VtZW50LT5wdHIpLT5lbmNvZGluZyk7 DQorCQkJeG1sT3V0cHV0QnVmZmVyRmx1c2gob3V0YnVmKTsNCisJCQlzdHJ2 YWwgPSB4bWxTdHJuZHVwKG91dGJ1Zi0+YnVmZmVyLT5jb250ZW50LCBvdXRi dWYtPmJ1ZmZlci0+dXNlKTsNCisJCQl4bWxPdXRwdXRCdWZmZXJDbG9zZShv dXRidWYpOw0KKwkJfQ0KKw0KKwkJKmJ1ZmZlciA9IGVzdHJkdXAoc3RydmFs KTsNCisJCSpidWZfbGVuID0gc3RybGVuKCpidWZmZXIpOw0KKwkJeG1sRnJl ZShzdHJ2YWwpOw0KKwl9IGVsc2Ugew0KKwkJcmV0dXJuIEZBSUxVUkU7DQor CX0NCisNCisJcmV0dXJuIFNVQ0NFU1M7DQorfQ0KKw0KK2ludCBzaW1wbGV4 bWxfdW5zZXJpYWxpemUoenZhbCAqKm9iamVjdCwgY29uc3QgdW5zaWduZWQg Y2hhciAqYnVmLCB6ZW5kX3VpbnQgYnVmX2xlbiwgemVuZF91bnNlcmlhbGl6 ZV9kYXRhICp1bnNlcmlhbGl6ZV9kYXRhIFRTUk1MU19EQykNCit7DQorCXBo cF9zeGVfb2JqZWN0ICpzeGU7DQorCXhtbERvY1B0ciAgICAgICBkb2NwOw0K Kwl6ZW5kX2NsYXNzX2VudHJ5ICpjZT0gc3hlX2NsYXNzX2VudHJ5Ow0KKw0K KyNpZiBMSUJYTUxfVkVSU0lPTiA+PSAyMDYwMA0KKwlkb2NwID0geG1sUmVh ZE1lbW9yeShidWYsIGJ1Zl9sZW4sIE5VTEwsIE5VTEwsIDApOw0KKyNlbHNl DQorCWRvY3AgPSB4bWxQYXJzZU1lbW9yeShidWYsIGJ1Zl9sZW4pOw0KKyNl bmRpZg0KKw0KKwlpZiAoISBkb2NwKSB7DQorCQlyZXR1cm4gRkFJTFVSRTsN CisJfQ0KKw0KKwlzeGUgPSBwaHBfc3hlX29iamVjdF9uZXcoY2UgVFNSTUxT X0NDKTsNCisJcGhwX2xpYnhtbF9pbmNyZW1lbnRfZG9jX3JlZigocGhwX2xp YnhtbF9ub2RlX29iamVjdCAqKXN4ZSwgZG9jcCBUU1JNTFNfQ0MpOw0KKwlw aHBfbGlieG1sX2luY3JlbWVudF9ub2RlX3B0cigocGhwX2xpYnhtbF9ub2Rl X29iamVjdCAqKXN4ZSwgeG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jcCksIE5V TEwgVFNSTUxTX0NDKTsNCisNCisJTUFLRV9TVERfWlZBTCgqb2JqZWN0KTsN CisJWl9UWVBFX1BQKG9iamVjdCkgPSBJU19PQkpFQ1Q7DQorCSgqb2JqZWN0 KS0+dmFsdWUub2JqID0gcGhwX3N4ZV9yZWdpc3Rlcl9vYmplY3Qoc3hlIFRT Uk1MU19DQyk7DQorCXJldHVybiBTVUNDRVNTOw0KK30NCisNCiAvKiB7e3sg UEhQX01JTklUX0ZVTkNUSU9OKHNpbXBsZXhtbCkNCiAgKi8NCiBQSFBfTUlO SVRfRlVOQ1RJT04oc2ltcGxleG1sKQ0KQEAgLTE2OTEsNiArMTc1Niw4IEBA DQogCXN4ZS5jcmVhdGVfb2JqZWN0ID0gc3hlX29iamVjdF9uZXc7DQogCXN4 ZV9jbGFzc19lbnRyeSA9IHplbmRfcmVnaXN0ZXJfaW50ZXJuYWxfY2xhc3Mo JnN4ZSBUU1JNTFNfQ0MpOw0KIAlzeGVfY2xhc3NfZW50cnktPmdldF9pdGVy YXRvciA9IHBocF9zeGVfZ2V0X2l0ZXJhdG9yOw0KKwlzeGVfY2xhc3NfZW50 cnktPnNlcmlhbGl6ZSA9IHNpbXBsZXhtbF9zZXJpYWxpemU7DQorCXN4ZV9j bGFzc19lbnRyeS0+dW5zZXJpYWxpemUgPSBzaW1wbGV4bWxfdW5zZXJpYWxp emU7DQogCXplbmRfY2xhc3NfaW1wbGVtZW50cyhzeGVfY2xhc3NfZW50cnkg VFNSTUxTX0NDLCAxLCB6ZW5kX2NlX3RyYXZlcnNhYmxlKTsNCiAJc3hlX29i amVjdF9oYW5kbGVycy5nZXRfbWV0aG9kID0gemVuZF9nZXRfc3RkX29iamVj dF9oYW5kbGVycygpLT5nZXRfbWV0aG9kOw0KIAlzeGVfb2JqZWN0X2hhbmRs ZXJzLmdldF9jb25zdHJ1Y3RvciA9IHplbmRfZ2V0X3N0ZF9vYmplY3RfaGFu ZGxlcnMoKS0+Z2V0X2NvbnN0cnVjdG9yOw0K --17473538-447763352-1109160165=:32475--