Wie (de)serialisiere ich Datenstrukturen?
Inhalt:
Problem
Du hast einen komplexen Hash, ein Array oder eine sonstige beliebige Datenstruktur in Perl. Du möchtest diese Struktur gerne abspeichern und beim nächsten Programmstart wieder einlesen. Evtl. möchtest du aber auch die serialisierte Struktur in einm Texteditor editieren können. Es gibt verschiedene Module mit verschiedenen Funktionen.
Module
Data::Dumper
Das Standard-Modul macht auf denkbar einfache Weise aus einer Perl-Variablen Perl-Code, den man in eine Datei speichern
kann und der mittels require z.B. wieder eingelesen werden kann. Idiotensicher, jedoch leicht manipulierbar; jemand mit Zugriff auf
die Datei könnte auch beliebigen Perl-Code hineinschreiben. In diesen Fällen sollte möglichst Safe::rdo oder Safe::reval statt require oder eval verwendet werden.
use Data::Dumper;
print Dumper $hashref;
# Ausgabe:
$VAR1 = {
'Alter' => 'uralt',
'Name' => 'ich',
'Lieblingsfarben' => [
'Rot',
'Weiß',
'Blau'
]
};
# datei
print FILE Data::Dumper->Dump([$hashref], ['dump']);
# ...
my $dump = require 'file';
Es kann mittlerweile auch Code-Referenzen speichern, für Details siehe die Manpage.
YAML
use YAML;
# eine Hash-Referenz laden
my ($hashref) = Load(<<'...');
---
Name: ich
Alter: uralt
# kommentar
Lieblingsfarben:
- Rot
- Weiß
- Blau
...
print Dump($hashref);
Ein Vorteil von YAML ist: es ist sprach-unabhängig. Es existieren mittlerweile YAML-Libraries für python, ruby, C, java, javascript...
Ein Nachteil: die Perl-Implementation YAML.pm ist leider noch recht buggy. Für einfache Konfigurationsdateien sollte es aber immer reichen.
Für einfache YAML-Dateien kann auch das Modul
YAML::Tiny verwendet werden. Es ist ziemlich schnell und für die meisten Fälle ausreichend.
Storable
Das Modul serialisiert ein Datenstruktur in ein binäres Format. Ein Nachteil ist, dass es zwischen bestimmten Versionen nicht kompatibel ist. Vorteil: Auf Wunsch nimmt es einem auch das File-Locking ab.
use Storable;
store \%table, 'file';
$hashref = retrieve('file');
$serialized = freeze \%table;
%table_clone = %{ thaw($serialized) };
Es kann mittlerweile auch Code-Referenzen speichern, für Details siehe die Manpage.
Wenn man Storable-Dateien zwischen verschiedenen Rechnerarchitekturen austauschen will, sollte man statt
store das portable
nstore verwenden.
XML::Simple
Einfaches Serialisieren in XML. Wichtig ist, dass man keine zu hohen Ansprüche an das XML hat, da ein von XML::Simple eingelesenes
XML ganz anders aussehen kann als das, was herauskommt.
Data::Dump::Streamer
Kommentare?
Data::Denter
Ein Vorgänger von YAML. Sollte heute nicht mehr verwendet werden.
XML::Dumper
Während XML::Simple versucht, das serialisierte Format recht kompakt zu halten, wird die Ausgabe bei XML::Dumper ziemlich aufgebläht. Man hat aber anders als bei XML::Simple die Sicherheit, dass man bei Serialisierung und Deserialisierung immer das Richtige erhält.
Data::Serializer
Ein Meta-Klasse, die die verschiedenen hier aufgeführten Serialisierer unter einen Hut bringt und zudem noch Verschlüsselung, Kompression und Checksummen anbietet.
FreezeThaw?
Alt und langsam. Sollte man nicht verwenden.
Übersicht
| Name |
Standard |
Format |
Datentypen |
Data::Dumper |
ab 5.5 |
plaintext, Perl-Code |
Hashes, Arrays, Skalare, Objekte, (Codereferenzen) |
YAML |
- |
plaintext, Einrückungen |
Hashes, Arrays, Skalare, Objekte |
Storable |
ab 5.7.3 |
binär |
Hashes, Arrays, Skalare, Objekte, (Codereferenzen) |
XML::Simple |
- |
XML |
Hashes, Arrays, Skalare |
Ergänzungen, Kommentare
Weitere Module ergänzt.
--
PlTk - 12 Aug 2005
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff