Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.php > #3395
| From | Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) |
|---|---|
| Newsgroups | de.comp.lang.php |
| Subject | verschachtelte Serialisierung |
| Date | 2015-07-14 08:36 +0000 |
| Message-ID | <3t55a4c7abiaa2n3e8%sfroehli@Froehlich.Priv.at> (permalink) |
Beim Versuch, mein Problem mit dem Autoloader zu debuggen, ist mir eine
andere Ungereimtheit aufgefallen - und da die im Gegensatz zum anderen
Problem sehr einfach isolierbar ist, gehe ich sie einmal bevorzugt an.
Die Frage reduziert sich im wesentlichen auf: implementiere ich das
Interface "Serializable" richtig? Falls ja, dann gibt es da IMHO einen
ziemlich unangenehmen Bug - falls nein, wie mache ich es korrekt?
#v+
<?php
class Foo implements Serializable {
private $baz = NULL;
public function __construct(Baz $baz) {
$this->baz = $baz;
}
public function serialize() {
return serialize(array(
'baz' => $this->baz
));
}
public function unserialize($serialized) {
$data = unserialize($serialized);
$this->baz = $data['baz'];
}
}
class Bar extends Foo {
private $bar1 = 'bar';
public function serialize() {
return serialize(array(
'bar1' => $this->bar1,
'parentData' => parent::serialize()
));
}
public function unserialize($serialized) {
$data = unserialize($serialized);
$this->bar1 = $data['bar1'];
parent::unserialize($data['parentData']);
}
}
class Baz implements Serializable {
private $baz1 = 'baz';
public function serialize() {
return serialize(array(
'baz1' => $this->baz1
));
}
public function unserialize($serialized) {
$data = unserialize($serialized);
$this->baz1 = $data['baz1'];
}
}
$baz = new Baz();
$bar1 = new Bar($baz);
$bar2 = new Bar($baz);
$a = [$bar1, $bar2];
var_dump($a);
echo "\n";
var_dump(unserialize(serialize($a)));
?>
#v-
Das Problem ist schnell beschrieben: unserialize() macht serialize()
nicht korrekt rückgängig.
Sieht man sich das (im Beispiel nicht ausgegebene) Zwischenergebnis an,
findet man für den Inhalt des zweiten Array-Elements den String:
| C:3:"Bar":73:{a:2:{s:4:"bar1";s:3:"bar";s:10:"parentData";s:20:"a:1:{s:3:"baz";r:4;}";}}}
Interessant ist darin vor allem das 's:3:"baz";r:4;' ganz innen, mit dem
Foo::baz beschrieben wird, und zwar als Referenz auf das bereits zuvor
serialisierte Baz() - wie die "4" genau ermittelt wird, habe ich ad hoc
nicht herausgefunden.
Beim Deserialisieren wird aber (sobald man hierarchisch angeordnete Klassen
verwendet!) ein ganz anderer Wert verwendet, in diesem Fall der String
"bar". Es kann nun die "4" beim Erzeugen der Serialisierung falsch sein,
oder die Auflösung beim Deserialisieren - oder natürlich ich irgendwo einen
Fehler eingebaut haben.
| PHP 5.4.41-1~dotdeb+7.1 (cli) (built: May 15 2015 10:59:59)
| Copyright (c) 1997-2014 The PHP Group
| Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
| with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike
Stefan, so affig wie die See. Alpträume werden wahr!
(Sloganizer)
Back to de.comp.lang.php | Previous | Next — Next in thread | Find similar
verschachtelte Serialisierung Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2015-07-14 08:36 +0000
Re: verschachtelte Serialisierung "Christoph M. Becker" <cmbecker69@arcor.de> - 2015-07-14 11:41 +0200
Re: verschachtelte Serialisierung "Christoph M. Becker" <cmbecker69@arcor.de> - 2015-07-14 16:33 +0200
Re: verschachtelte Serialisierung "Christoph M. Becker" <cmbecker69@arcor.de> - 2015-07-14 21:51 +0200
Re: verschachtelte Serialisierung Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2015-07-15 12:14 +0000
Re: verschachtelte Serialisierung "Christoph M. Becker" <cmbecker69@arcor.de> - 2015-07-15 20:20 +0200
Re: verschachtelte Serialisierung Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2015-07-15 19:53 +0000
csiph-web