<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xml:id="function.serialize" xmlns="http://docbook.org/ns/docbook">
 <refnamediv>
  <refname>serialize</refname>
  <refpurpose>Generates a storable representation of a value</refpurpose>
 </refnamediv>
 
 <refsect1 role="description">
  &reftitle.description;
   <methodsynopsis>
    <type>string</type><methodname>serialize</methodname>
    <methodparam><type>mixed</type><parameter>value</parameter></methodparam>
   </methodsynopsis>
  <para>
   Generates a storable representation of a value.
  </para>
  <para>
   This is useful for storing or passing PHP values around without
   losing their type and structure.
  </para>
  <para>
   To make the serialized string into a PHP value again, use
   <function>unserialize</function>.  
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>value</parameter></term>
     <listitem>
      <para>
       The value to be serialized. <function>serialize</function>
       handles all types, except the <type>resource</type>-type and some <type>object</type>s (see note below).
       You can even <function>serialize</function> arrays that contain
       references to itself. Circular references inside the array/object you 
       are serializing will also be stored. Any other 
       reference will be lost.
      </para>
      <para>
       When serializing objects, PHP will attempt to call the member functions
       <link linkend="object.serialize">__serialize()</link> or
       <link linkend="object.sleep">__sleep()</link> prior to serialization.
       This is to allow the object to do any last minute clean-up, etc. prior 
       to being serialized. Likewise, when the object is restored using 
       <function>unserialize</function> the <link linkend="object.unserialize">__unserialize()</link> or
       <link linkend="object.wakeup">__wakeup()</link> member function is called.
      </para>
      <note>
       <para>
       Object's private members have the class name prepended to the member
       name; protected members have a '*' prepended to the member name.
       These prepended values have null bytes on either side.
       </para>
      </note>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Returns a string containing a byte-stream representation of 
   <parameter>value</parameter> that can be stored anywhere.
  </para>
  <para>
   Note that this is a binary string which may include null bytes, and needs
   to be stored and handled as such. For example,
   <function>serialize</function> output should generally be stored in a BLOB
   field in a database, rather than a CHAR or TEXT field.
  </para>
 </refsect1>

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title><function>serialize</function> example</title>
    <programlisting role="php">
<![CDATA[
<?php
// $session_data contains a multi-dimensional array with session
// information for the current user.  We use serialize() to store
// it in a database at the end of the request.

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn,
      "UPDATE sessions SET data = ? WHERE id = ?");
$sqldata = array (serialize($session_data), $_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata)) {
    $stmt = odbc_prepare($conn,
     "INSERT INTO sessions (id, data) VALUES(?, ?)");
    if (!odbc_execute($stmt, array_reverse($sqldata))) {
        /* Something went wrong.. */
    }
}
?>
]]>
    </programlisting>
   </example>
  </para>
 </refsect1>

 <refsect1 role="notes">
  &reftitle.notes;
  <note>
   <para>
    Note that many built-in PHP objects cannot be serialized. However, those with 
    this ability either implement the <interfacename>Serializable</interfacename> interface or the 
    magic <link linkend="object.serialize">__serialize()</link>/<link linkend="object.unserialize">__unserialize()</link>
    or <link linkend="object.sleep">__sleep()</link>/<link linkend="object.wakeup">__wakeup()</link> methods. If an
    internal class does not fulfill any of those requirements, it cannot reliably be 
    serialized.
   </para>
   <para>
    There are some historical exceptions to the above rule, where some internal objects 
    could be serialized without implementing the interface or exposing the methods.
   </para>
  </note>
  <warning>
   <para>
    When <function>serialize</function> serializes objects, the leading backslash is not included in the class name of namespaced classes for maximum compatibility.
   </para>
  </warning>
 </refsect1>

 <refsect1 role="seealso">
  &reftitle.seealso;
  <para>
   <simplelist>
    <member><function>unserialize</function></member>
    <member><function>var_export</function></member>
    <member><function>json_encode</function></member>
    <member><link linkend="language.oop5.serialization">Serializing Objects</link></member>
    <member><link linkend="object.sleep">__sleep()</link></member>
    <member><link linkend="object.wakeup">__wakeup()</link></member>
    <member><link linkend="object.serialize">__serialize()</link></member>
    <member><link linkend="object.unserialize">__unserialize()</link></member>
   </simplelist>
  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
