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...
CLXXIV. WDDX 関数
導入
以下の関数は、» WDDX と組み合わせて 動作することを想定しています。
要件
WDDX を使用するには、(Apache 1.3.7 以降に付属する) expat ライブラリを インストールする必要があります。
インストール手順
expat をインストールした後、 --enable-wddx を指定して PHP を コンパイルする必要があります。
Windows 版の PHP には この拡張モジュールのサポートが組み込まれています。これらの関数を使用 するために拡張モジュールを追加でロードする必要はありません。
実行時設定
設定ディレクティブは定義されていません。
リソース型
この拡張モジュールでは、WDDX パケット ID を定義しています。これは wddx_packet_start() が返すものです。
定義済み定数
定数は定義されていません。
例
変数をシリアル化する全ての関数は配列の最初要素をその配列が配列と 構造体のどちらでシリアル化されるのかを定義するために使用するということに 注意してください。最初の要素が文字列をキーとして有する場合は 構造体でシリアル化され、その他の場合は配列でシリアル化されます。
例 2535. WDDX を使用した単一の値のシリアル化
<?php
echo wddx_serialize_value("PHP to WDDX packet example", "PHP packet");
?>
この例は次の出力を行います。
<wddxPacket version='1.0'><header comment='PHP packet'/><data>
<string>PHP to WDDX packet example</string></data></wddxPacket>
例 2536. WDDX を使用してパケットを追加する例
<?php
$pi = 3.1415926;
$packet_id = wddx_packet_start("PHP");
wddx_add_vars($packet_id, "pi");
/* $cities はデータベースから取得するものと仮定します */
$cities = array("Austin", "Novato", "Seattle");
wddx_add_vars($packet_id, "cities");
$packet = wddx_packet_end($packet_id);
echo $packet;
?>
この例は次のような出力を行います。
<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>
注意: ASCII以外の文字をシリアル化したい場合、まず最初に データを UTF-8 に変換する必要があります (utf8_encode() および iconv() を参照ください)。
目次
- wddx_add_vars — 指定した ID の WDDX パケットを追加する
- wddx_deserialize — wddx_unserialize() のエイリアス
- wddx_packet_end — 指定した ID の WDDX パケットを終了する
- wddx_packet_start — 新規の WDDX パケットを内部の構造体を用いて開始する
- wddx_serialize_value — 単一の値を WDDX パケットにシリアライズする
- wddx_serialize_vars — 変数を WDDX パケットにシリアライズする
- wddx_unserialize — シリアライズされた WDDX パケットを元に戻す
WDDX 関数
13-Aug-2007 06:09
16-Jul-2004 09: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 10: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
04-Sep-2002 02: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 11: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 06:32
Tutorial here :
XML and PHP. Part 1: Using the WDDX functions
http://www.phpbuilder.net/columns/jesus20000402.php3
02-Mar-2000 08: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 08: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>
19-Oct-1999 12: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>