To bradburn at kiwi dot de:
PHP is only capable of serializing properly variables which match one of its native (scalar) types (See http://php.net/types). Which means that only variables of type booleans, integers, floating point numbers, string and NULL will be serialized properly.
I think there are two exceptions though:
- arrays are serialized by processing them recursively, so if its only composed of the above mentioned types, you should be fine.
- floating point numbers and integers may use the same representation while serialized in WDDX (I don't know much about WDDX, so I'm not 100% sure about this statement).
An interesting case would be whether objects can be serialized or not...
CLXXIII. WDDX funkce
Úvod
Tyto funkce jsou určeny pro práci s » WDDX.
Požadavky
Pokud chcete používat WDDX, budete muset nainstalovat expat knihovnu (která je u Apache 1.3.7 a vyšších).
Instalace
Po instalaci expatu zkompilujte PHP s volbou --enable-wddx.
Verze PHP pro Windows má vestavěnou podporu pro toto rozšíření. K použití těchto funkcí není třeba načítat žádná další rozšíření.
Konfigurace běhu
Toto rozšíření nemá definováno žádné konfigurační direktivy.
Typy prostředků
Toto rozšíření nemá definován žádný typ prostředku (resource).
Předdefinované konstanty
Toto rozšíření nemá definovány žádné konstanty.
Příklady
Všechny funkce, které serializují proměnné, používají první element pole k rozhodnutí jestli se toto pole serializuje do pole nebo struktury. Pokud má první element řetězec jako index, serializuje se do struktury, jinak do pole.
Příklad 2241. Serializace jediné hodnoty
<?php
print wddx_serialize_value("Ukázka převodu paketu z PHP do WDDX", "PHP packet");
?>
Tato ukázka vytvoří:
<wddxPacket version='1.0'><header comment='PHP packet'/><data>
<string>Ukázka převodu paketu z PHP do WDDX</string></data></wddxPacket>
Příklad 2242. Použití inkrementálních paketů
<?php
$pi = 3.1415926;
$packet_id = wddx_packet_start("PHP");
wddx_add_vars($packet_id, "pi");
/* Předpokládejme, že $cities pochází z databáze */
$cities = array("Austin", "Novato", "Seattle");
wddx_add_vars($packet_id, "cities");
$packet = wddx_packet_end($packet_id);
print $packet;
?>
Tato ukázka vytvoří:
<wddxPacket version='1.0'><header comment='PHP'/><data><struct>
<var name='pi'><number>3.1415926</number></var><var name='cities'>
<array length='3'><string>Austin</string><string>Novato</string>
<string>Seattle</string></array></var></struct></data></wddxPacket>
Poznámka: If you want to serialize non-ASCII characters you have to set the appropriate locale before doing so (see setlocale()).
Obsah
- wddx_add_vars — Přidat proměnné do WDDX paketu s určeným ID
- wddx_deserialize — Deserializovat WDDX paket
- wddx_packet_end — Ukončit WDDX paket se zadaným ID
- wddx_packet_start — Začít nový WDDX paket obsahující strukturu
- wddx_serialize_value — Serializovat jedinou hodnotu do WDDX paketu
- wddx_serialize_vars — Serializovat proměnné do WDDX paketu
- wddx_unserialize — Unserializes a WDDX packet
WDDX funkce
12-Aug-2007 02:09
15-Jul-2004 05:53
PHP's WDDX is useful only for exchanging data between PHP applications, but definetly not for exchanging data between different languages (which actually defeats the purpose of WDDX).
For example:
$hash1 = array ("2" => "Two", "4" => "Four", "5" => "Five");
$hash2 = array ("0" => "Zero", "1" => "One", "2" => "Two");
$hash1 will be serialized as hash, but
$hash2 will be serialized as array/list, because the key happen to be a sequence starting from 0.
Unless the library provide a way for users to specify the type, it can never be used for cross-platform data exchange.
21-Nov-2003 05:08
To insert arrays into a wddx variable here is a fine way to do it:
<?php
$sql = 'SELECT * FROM example';
$query = mysql_query($sql, $db) or die(mysql_error());
while($result = mysql_fetch_array($query)) {
$id[] = $result[ 'id'];
$name[] = $result['name'];
$description[] = $result[$prefix . 'description'];
}
mysql_free_result($query);
wddx_add_vars($packet_id, "id");
wddx_add_vars($packet_id, "name");
wddx_add_vars($packet_id, "description");
$wddxSerializeValue = wddx_packet_end($packet_id);
?>
wddx isn't 100% perl compatible .. I have an wddx file infront of me and it only works with php so better don't use it
03-Sep-2002 10:11
a good FAQ on WDDX can be found here:
http://www.macromedia.com/v1/handlers/index.cfm?id=5622&method=full
30-Jul-2002 07:02
With ref to the above comment about typing, I have found that -- oddly enough -- PHP's WDDX supports the following WDDX types: null, boolean (true/false), number and string, *but* not date-time.
as an example, use the following values in an array that you then serialize:
$number = 5,
$null = NULL,
$bool = true,
$string = 'this is a string'.
they will all serialize correctly, e.g. the third entry comes out as:
<var name='bool'><boolean value='true'/></var>
i have tried with the 'official' format for WDDX 'datetime', e.g. '1998-9-15T09:05:32+4:0' (from the DTD @ http://www.openwddx.org/downloads/dtd/wddx_dtd_10.txt) but have only succeeded in getting this encoded as a 'string' type.
if anyone else has any more information on this, it would be welcome. i would like to store the variables in 'appropriate' fields in a database, and the fact that only datetime is not supported is slightly irritating -- otherwise it would be a very useful function.
17-Nov-2000 01:32
Tutorial here :
XML and PHP. Part 1: Using the WDDX functions
http://www.phpbuilder.net/columns/jesus20000402.php3
02-Mar-2000 03:50
Here's a rewrite of the deserializing Perl code that uses variable names consistently with the serializing example. Sorry for any confusion....
<PRE>
#!/usr/bin/perl
use WDDX;
open(FP, "<cities.wddx");
undef $/; # Slurp the whole file.
$packet = <FP>;
close(FP);
$wddx = new WDDX;
$packet_id = $wddx->deserialize($packet);
$value = $packet_id->as_hashref();
print "pi is:<br>" . $value->{"pi"} . "<p>\n";
print "cities is:<br>\n";
$key = 0;
foreach $val (@{$value->{"cities"}}) {
print "$key => $val<br>\n";
$key++;
}
</PRE>
02-Mar-2000 03:36
I think it would be helpful for passing data between languages to show a direct translation of the above examples into Perl, using WDDX.pm 1.00 from CPAN. It took me awhile to figure out. To serialize:
<PRE>
#!/usr/bin/perl
use WDDX;
$wddx = new WDDX;
$packet_id = $wddx->struct({});
$pi = 3.1415926;
$packet_id->set("pi" => $wddx->number($pi));
# Suppose @cities came from database
@cities = ("Austin", "Novato", "Seattle");
$packet_id->set("cities" => $wddx->array([map $wddx->string($_), @cities]));
$packet = $wddx->serialize($packet_id);
open(FP, ">cities.wddx");
print FP $packet;
close(FP);
</PRE>
<P>
To deserialize:
<PRE>
#!/usr/bin/perl
use WDDX;
open(FP, "<cities.wddx");
undef $/; # Slurp the whole file.
$packet = <FP>;
close(FP);
$packet_id = new WDDX;
$wddx_obj = $packet_id->deserialize($packet);
$value = $wddx_obj->as_hashref();
print "pi is:<br>" . $value->{"pi"} . "<p>\n";
print "cities is:<br>\n";
$key = 0;
foreach $val (@{$value->{"cities"}}) {
print "$key => $val<br>\n";
$key++;
}
</PRE>
18-Oct-1999 08:45
Since there aren't any examples of reversing the process, here's one. If you had the packet produced by the above example (without the htmlentities() call), you could retrieve the values like this:
<pre>
$value = wddx_deserialize($packet);
print "pi is:<br>" . $value["pi"] . "<p>\n";
print "cities is:<br>\n";
while (list($key, $val) = each($value["cities"])) {
print "$key => $val<br>\n";
}
</pre>
which outputs:
<pre>
pi is:
3.1415926
cities is:
0 => Austin
1 => Novato
2 => Seattle
</pre>
