JavaScript-Objekte serialisieren

Bei komplexeren Anwendungen, ensteht schonmal das Bedürfnis, auf dem Rechner des Nutzers generierte JavaScript-Objekte, Arrays und sonstige Variablen an einen Server zu schicken. Nur leider funktioniert das nicht so ganz mit XMLHttpRequest, da POST nur eindimensionale Parameter unterstützt.

Allerdings bietet PHP mit unserialize() eine schöne Funktion, um aus Plaintext beliebig komplexe Variablen zu erzeugen. Jetzt muss man nur noch das JavaScript-Objekt in einen solchen serialisierten String umwandeln und auf dem Server wieder entserialisieren:

serialize = function(elem) {
  if (elem == null || elem == undefined || elem.constructor == Function) return 'N;';

  switch (elem.constructor) {
    case String:  return 's:' + elem.length + ':"' + elem + '";';
    case Number:  return (elem % 1 ? 'd:' : 'i:') + elem + ';';
    case Boolean: return 'b:' + (elem ? '1' : '0') + ';';     
    case Date:    return serialize(elem.getTime());
    case RegExp:  return serialize(elem.toSource());
    case Error:   return serialize(elem.message);
    case Array:
    case Object:
      var content = '', i = 0;
      for (var j in elem) { content += serialize(j) + serialize(elem[j]); i++; }
      return 'a:' + i + ':{' + content + '}';
    default:
      return serialize(elem.toString());
  }
}

Standardobjekte, die beispielsweise mit { } erstellt wurden, werden zu Arrays konvertiert, da es nicht so viel Sinn gibt, sie in PHP als Objekte anzusprechen - sie sind ja letztendlich nur Hashes. Wenn das JS-Objekt allerdings etwas komplexer ist, also nicht den Konstruktor Object hat, kann man die Serialisierungsfunktion natürlich trotzdem nutzen. In der toString()-Methode des jeweiligen Objekts, kann man beliebige einfachere Datentypen zurückgeben, die dann stattdessen serialisiert werden.

Achtung! Es ist nicht getestet, ob über unserialize() eventuell schadhafter Code auf dem Server ausgeführt werden kann. Also vorher gründlich testen oder doch JSON benutzen.