Encodingprobleme bei der Objektserialisierung

Ich habe ein Array mit Objekten, welches ich in einer Datei speichere. Die Datei sieht korrekt aus, nur leider gibt mit der Befehl "file" Solitaire Image Recorder format zurück ...

PHP:
	public function save()
	{
		if (false !== ($fp = fopen($this->filename, "wb")))
		{
			foreach ($this->list as $item)
			{
				if (fwrite($fp, serialize($item)."\n") == false)
				return false;
			}
			fclose($fp);
			return true;
		}
		return false;
	}

Wenn ich nun das Objekt laden will, hab ich kryptische Symbole in der Ausgabe, weshalb ich ein Encoding-Problem vermute. Zum Laden benutze ich file, eine foreach-Schleife und trim(), um die Zeilenumbrüche zu entfernen. Hat mir jemand einen Tipp?

Ubuntu Linux übrigens, aktuelleste Version. Apache2 Webserver, PHP 5.3
 
Hat die von dir erstellte Datei eventuell eine falsche Dateiendung? Solitaire Image Recorder format müsste ja .sir sein, was ja nicht so richtig sinnvoll wäre.

Btw. zum Thema == false / == true gibt es hier einen schönen Beitrag. Wurde zwar eigentlich für C# verfasst aber gilt genauso für PHP.
 
Ich speicher in eine ini-Datei ;)

Was ich noch rausgefunden habe:
- Wenn ich die Objekte auf meiner Startseite anzeigen lassen will, erhalte ich eine PHP Incomplete Class Fehlermeldung
Code:
object(__PHP_Incomplete_Class)[4]
  public '__PHP_Incomplete_Class_Name' => string 'Host' (length=4)
  . . .

=== sollte eigentlich so aussehen ===

object(Host)[3]
. . .

- Wenn ich die Objekte auf der Seite anzeigen lassen will, mit der ich sie erstelle, gibts keine Fehlermeldung. Die Daten werden in einer Tabelle korrekt dargestellt.
- Auf beiden Seiten werden jedoch dieselben Befehle in derselben Reihenfolge ausgeführt. Containerklasse wird erstellt und die oben erwähnte Lademethode ausgeführt. Das wars.
- Die kryptischen Zeichen besitzen den ASCII Wert 0. Lösche ich die Zeichen vor dem Deserialisieren, gibt mir unserialize() eine Offset Fehlermeldung zurück
 
Ich hab das Problem in den Griff bekommen.

Erstmal zu der Incomplete Class Fehlermeldung:
PHP erkennt die Klasse nicht, d.h. die Klasse ist vermutlich nicht eingebunden oder aus anderen Gründen nicht erreichbar. Einfach sicherstellen, dass PHP die Klasse findet (der vermutliche Name wird euch sogar als erstes Objektattribut angezeigt) und die Fehlermeldung ist weg.

Dann die Sache mit den Symbolen vom ASCII Wert 0:
Ich vermute, dass PHP die Zeichen beim Serialisieren einfügt, um leichter oder überhaupt Objektattribute und -Methoden erkennen zu können. Man muss damit gar nichts machen, es war wohl ein Folgefehler, weil ich eben die Klasse nicht eingebunden hatte. Beim Deserialisieren verschwinden die Zeichen und PHP bastelt sich das Objekt wieder zusammen.

Fazit: Das vergessene Einbinden einer Klasse hat mich gestern einen Nachmittag und heute nochmal 2 Stunden gekostet. PHP ist nicht meine Welt ^^

@rd4eva: Musste mir den Beitrag mehrmals durchlesen, um den Sinn zu verstehen. Interessante Sichtweise, danke dafür ;)
 
Glückwunsch zur Lösung erstmal.

Bin gerade in der unserialize doku noch über etwas gestolpert. Eventuell hätte das auch geholfen. Kanns leider nicht testen weil ichs nicht nachgestellt kriege ;).
str

The serialized string.

If the variable being unserialized is an object, after successfully reconstructing the object PHP will automatically attempt to call the __wakeup() member function (if it exists).

Note: unserialize_callback_func directive
It's possible to set a callback-function which will be called, if an undefined class should be instantiated during unserializing. (to prevent getting an incomplete object "__PHP_Incomplete_Class".) Use your php.ini, ini_set() or .htaccess to define 'unserialize_callback_func'. Everytime an undefined class should be instantiated, it'll be called. To disable this feature just empty this setting.
 
Hm ... joa ... mit der Funktion hätte ich mir dann aus den Attributen ein neues Objekt erstellen können. Wäre dann die Notlösung gewesen :)
 
Zurück