NAME
Data::Taxi - Taint-aware, XML-ish data serialization
SYNOPSIS
use Data::Taxi ':all';
my ($ob, $str);
$ob = MyClass->new();
$str = freeze($ob);
$ob = thaw($str);
INSTALLATION
Data::Taxi can be installed with the usual routine:
perl Makefile.PL
make
make test
make install
You can also just copy Taxi.pm into the Data/ directory of one of your library trees.
DESCRIPTION
Taxi (Taint-Aware XML-Ish) is a data serializer with several handy features:
- Taint aware
-
Taxi does not force you to trust the data you are serializing. None of the input data is executed.
- Human readable
-
Taxi produces a human-readable string that simplifies checking the output of your objects.
- XML-ish
-
While I don't (currently) promise full XML compliance, Taxi produces a block of XML-ish data that could probably be read in by other XML parsers.
EXPORT
None by default. freeze and thaw with ':all':
use Data::Taxi ':all';
Subroutines
freeze($ob)
freeze
serializes a single scalar, hash reference, array reference, or scalar reference into an XML string, freeze
can recurse any number of levels of a nested tree and preserve multiple references to the same object. Let's look at an example:
my ($tree, $format, $members, $bool, $mysca);
# anonymous hash
$format = {
'app'=>'trini',
'ver'=>'0.9',
'ver'=>'this & that',
};
# anonymous array
$members = ['Starflower', 'Mary', 'Paul', 'Hallie', 'Ryan'];
# blessed object
$bool = Math::BooleanEval->new('whatever');
# scalar reference (to an anonymous hash, no less)
$mysca = {'name'=>'miko', 'email'=>'miko@idocs.com', };
# the whole thing
$tree = {
'dataformat' => $format,
'otherdataformat' => $format,
'bool' => $bool,
'members' => $members,
'myscaref' => \$mysca,
};
$frozen = freeze($tree);
freeze
accepts one object as input. The code above results in the following XML-ish string:
<taxi ver="1.00">
<hashref id="0">
<hashref name="otherdataformat" id="1">
<scalar name="ver" value="this &amp; that"/>
<scalar name="app" value="trini"/>
</hashref>
<scalarref name="myscaref" id="2">
<hashref id="3">
<scalar name="email" value="miko@idocs.com"/>
<scalar name="name" value="miko"/>
</hashref>
</scalarref>
<hashref name="bool" id="4" class="Math::BooleanEval">
<hashref name="blanks" id="5">
</hashref>
<scalar name="pos" value="0"/>
<arrayref name="arr" id="6">
<scalar value="whatever"/>
</arrayref>
<scalar name="expr" value="whatever"/>
</hashref>
<hashref name="dataformat" id="1" redundant="1"/>
<arrayref name="members" id="7">
<scalar value="Starflower"/>
<scalar value="Mary"/>
<scalar value="Paul"/>
<scalar value="Hallie"/>
<scalar value="Ryan"/>
</arrayref>
</hashref>
</taxi>
thaw
thaw
accepts one argument, the serialized data string, and returns a single value, the reconstituted data, rebuilding the entire data structure including blessed references.
$tree = thaw($frozen);
IS TAXI DATA XML?
Although Taxi's data format is XML-ish, it's not fully compliant to XML in all regards. For now, Taxi only promises that it can input its own output. The reason I didn't go for full XML compliance is that I wanted to keep Taxi as light as possible while achieving its main goal in life: pure-perl serialization. XML compliance is not part of that goal. If you want to help make Taxi fully XML compliant w/o making it bloated, that's cool, drop me an email and we can work together.
TODO
Tied scalars don't work. The code started getting spaghettish trying to implement them, so I decided to use the Asimov method and stop thinking about it for a while. Tied hashes and arrays should work fine.
TERMS AND CONDITIONS
Copyright (c) 2002 by Miko O'Sullivan. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. This software comes with NO WARRANTY of any kind.
AUTHOR
Miko O'Sullivan miko@idocs.com
VERSION
Version 0.90 June 15, 2002
initial public release
Version 0.91 July 10, 2002
minor improvment to documentation
Version 0.94 April 26, 2003
Fixed problem handling undefined scalars.
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 634:
=end CPAN without matching =begin. (Stack: [empty])